Практики / Практика 4
.docЛипецкий государственный технический университет
Кафедра автоматизированных систем управления
Практическая работа №4
по средствам и методам защиты информации
Асимметричные системы шифрования
|
Студент |
|
|
|
Филатов А.А. |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-09-2 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
|
|
|
|
Батищев Р.В. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2012
1. Задание
Изучить асимметричные методы шифрования. Реализовать метод RSA. Зашифровать и расшифровать заданное слово, используя заданные ключи, различные для шифрования и дешифрования.
2. Краткая теория
RSA (аббревиатура от фамилий Rivest, Shamir и Adleman) — криптографический алгоритм с открытым ключом, основывающийся на вычислительной сложности задачи факторизации больших целых чисел.
RSA-ключи генерируются следующим образом:[14]
Выбираются два различных случайных простых числа и заданного размера (например, 1024 бита каждое).
Вычисляется их произведение , которое называется модулем.
Вычисляется значение функции Эйлера от числа :
Выбирается целое число (), взаимно простое со значением функции . Обычно в качестве берут простые числа, содержащие небольшое количество единичных бит в двоичной записи, например, простые числа Ферма 17, 257 или 65537.
Число называется открытой экспонентой (англ. public exponent)
Время, необходимое для шифрования с использованием быстрого возведения в степень, пропорционально числу единичных бит в .
Слишком малые значения , например 3, потенциально могут ослабить безопасность схемы RSA.[15]
Вычисляется число , мультипликативно обратное к числу по модулю , то есть число, удовлетворяющее условию:
Число называется секретной экспонентой. Обычно, оно вычисляется при помощи расширенного алгоритма Евклида.
Пара публикуется в качестве открытого ключа RSA (англ. RSA public key).
Пара играет роль закрытого ключа RSA (англ. RSA private key) и держится в секрете.
3. Текст программы
#include <math.h>
#include <iostream>
#include <locale.h>
using namespace std;
int PowerMod(int a, int b, int c) {
// возведение t в степень k
a%=c;
int res = 1;
while (b)
{
if (b & 1) res =(res*a)%c;
a=(a*a)%c;
b >>= 1;
}
return res;
}
struct en_p
{
char en[10];
double hash;
};
void main()
{
int e=11, d=131;
int n=143;
setlocale(LC_ALL,"Rus");
char m[]="антифашист";
char dec[10];
double hash =0;
cout << "Исходное сообщение: ";
for(int i=0;i<strlen(m);i++)
cout << m[i];
cout << endl;
struct en_p enp;
for(int i=0;i<strlen(m);i++)
enp.en[i] = PowerMod((int)m[i]+33,e,n) - 33;
cout << "Закодированное сообщение: ";
for(int i=0;i<strlen(m);i++)
cout << (int) enp.en[i] << " ";
cout << endl;
enp.hash=0;
for(int i=0;i<10;i++)
{
enp.hash+=((int)enp.en[i]+33)%3;
}
cout << "Хэш: " << enp.hash << endl;
enp.hash = PowerMod((int)enp.hash,e,n);
cout << "Зашифрованный хэш: " << enp.hash << endl;
int enhash = PowerMod((int)enp.hash,d,n);
cout << "Расшифрованный хэш: " << enhash << endl;
double hash1=0;
for(int i=0;i<10;i++)
{
hash1+=((int)enp.en[i]+33)%3;
}
cout << "Пересчитанный хэш: " << hash1 << endl;
if(enhash == hash1)
cout << "Проверка подлинности прошла успешно!" << endl;
for(int i=0;i<strlen(m);i++)
dec[i] = PowerMod((int)enp.en[i]+33,d,n)-33;
cout << "Дешифрованное сообщение: ";
for(int i=0;i<strlen(m);i++)
cout << dec[i];
cout << endl;
system("pause");
}
4. Пример
6. Выводы о проделанной работе
В данной практической работе был реализован алгоритм RSA шифрования. Было выяснено, что для шифрования используется одна пара ключей, а для расшифрования другая. В результате зашифрованное одним ключом слово дешифруется правильно.
7. Список источников
-
GFI LANGuard: Официальный сайт. URL: http://www.gfi.ru/languard. 24.09.2012
-
Dr. Web. URL: http://vms.drweb.com/. 24.09.2012