Изучение алгоритма асимметричного шифрования
Цель работы: изучить один из алгоритмов асимметричного шифрования.
Задание: разработать и отладить приложение, реализующее алгоритм асимметричного шифрования RSA.
Ход работы
Описание алгоритма
RSA (аббревиатура от фамилий Rivest, Shamir и Adleman) — криптографический алгоритм с открытым ключом, основывающийся на вычислительной сложности задачи факторизации больших целых чисел.
RSA-ключи генерируются следующим образом:
1. Выбираются два различных случайных простых числа p и q заданного размера (например, 1024 бита каждое).
2. Вычисляется их произведение n= pq, которое называется модулем.
3. Вычисляется значение функции Эйлера от числа n:
4. Выбирается целое число - открытая экспонента, взаимно простое со значением функции
. Обычно в качестве e берут простые числа, содержащие небольшое количество единичных бит в двоичной записи, например, простые числа Ферма 17, 257 или 65537.
5. Вычисляется число d – секретная экспонента, мультипликативно обратное к числу e по модулю , то есть число, удовлетворяющее условию:
6. Пара {e,n} публикуется в качестве открытого ключа RSA (англ. RSA public key).
7. Пара {d,n} играет роль закрытого ключа RSA (англ. RSA private key) и держится в секрете.
Шифрование: .
Дешифрование:
Листинг:
#include <stdio.h>
#include <conio.h>
int phi,M,n,e,d,C,FLAG;
void check()
{
int i;
for(i=3;e%i==0 && phi%i==0;i+2)
{
FLAG = 1;
return;
}
FLAG = 0;
}
void encrypt()
{
int i;
C = 1;
for(i=0;i< e;i++)
C=C*M%n;
C = C%n;
printf("\n\tEncrypted keyword : %d",C);
}
void decrypt()
{
int i;
M = 1;
for(i=0;i< d;i++)
M=M*C%n;
M = M%n;
printf("\n\tDecrypted keyword : %d",M);
}
void main()
{
int p,q,s;
printf("Enter Two Relatively Prime Numbers\t: ");
scanf("%d%d",&p,&q);
n = p*q;
phi=(p-1)*(q-1);
printf("\n\tF(n)\t= %d",phi);
do
{
printf("\n\nEnter e\t: ");
scanf("%d",&e);
check();
}while(FLAG==1);
d = 1;
do{
s = (d*e)%phi;
d++;
}while(s!=1);
d = d-1;
printf("\n\tPublic Key\t: {%d,%d}",e,n);
printf("\n\tPrivate Key\t: {%d,%d}",d,n);
printf("\n\nEnter The Plain Text\t: ");
scanf("%d",&M);
encrypt();
printf("\n\nEnter the Cipher text\t: ");
scanf("%d",&C);
decrypt();
getch();
}
Вывод: я изучил алгоритм RSA.
лабораторная работа №3