- •Содержание
- •2.Краткое описание алгоритма шифра Эль-Гамаля.
- •3.Реализация шифрования дешифрования методом Эль-Гаммеля
- •3.1.Описание основных функций и переменных
- •3.2Результаты выполнения программы.
- •4.Краткое описание алгоритма электронной подписи Диффи-Хеллмана.
- •История
- •Описание алгоритма
- •5.1. Описание основных функций и переменных.
- •5. Реализация алгоритма подписи сообщения c помощью системы Диффи-Хеллмана.
- •5.2Результат выполнения программы.
- •6. Краткое описание алгоритма rc4.
- •7. Реализация алгоритма rc4.
- •7.1. Описание основных функций и переменных.
- •7.2. Результаты выполнения программы.
3.Реализация шифрования дешифрования методом Эль-Гаммеля
3.1.Описание основных функций и переменных
#include <iostream>//подключение встроенных библиотек
#include <fstream>
#include <stdio.h>
#include <cstdlib>
#include <math.h>//
using namespace std;
//ELGamm
void extended_euclid(__int64 a, __int64 b, __int64 *x, __int64 *y, __int64 *d)
/* calculates a * *x + b * *y = gcd(a, b) = *d */
{// алгоритм для нахождения наибольшего общего делителя двух целых чисел
__int64 q, r, x1, x2, y1, y2;
if (b == 0) {
*d = a, *x = 1, *y = 0;
return;
}
x2 = 1, x1 = 0, y2 = 0, y1 = 1;
while (b > 0) {
q = a / b, r = a - q * b;
*x = x2 - q * x1, *y = y2 - q * y1;
a = b, b = r;
x2 = x1, x1 = *x, y2 = y1, y1 = *y;
}
*d = a, *x = x2, *y = y2;
}
__int64 invmod(__int64 a, __int64 n)
/* computes the inverse of a modulo n */
{
__int64 d, x, y;
extended_euclid(a, n, &x, &y, &d);
if (d == 1)
if (x>0)
return x;
else
return x+n;
return 0;
}
__int64 powmod(__int64 a, __int64 k, __int64 n)
{//вычисление a^k mod n
__int64 b=1;
while (k) {
if (k%2==0) {
k /= 2;
a = (a*a)%n;
}
else {
k--;
b = (b*a)%n;
}
}
return b;
}
main() {
__int64 P,G,X,Y,K,M,a,b,MM;
P=65537;//public
G=32768;//public
X=45621;//privat
Y=powmod(G,X,P);//public
K=37121;//privat
//Шифруем
FILE* f_in = fopen("ELGamm_in.txt","r"); //открываем файл для чтения
FILE* f_out= fopen("ELGamm_out.txt","w");//открываем файл для записи
if(f_in != NULL)
{
int i=0;
char ch;
while((ch = getc(f_in)) != EOF)//пока не конец файла
{
M=ch;
a=powmod(G,K,P);//вычисляем шифротекст и записываем
fprintf(f_out,"%Ld ",a);//его в файл, для шифрованного
b=powmod(Y,K,P)*M % P;//сообшения
fprintf(f_out,"%Ld ",b);
}
fprintf(f_out,"%Ld\n",0);//обозначаем конец файла нулевыми a и b
fprintf(f_out,"%Ld\n",0);
}
else printf("No file(read).\n");
fclose(f_in);//закрываем открытые ранее
fclose(f_out);//файлы
//ДеШифруем
FILE* fin = fopen("ELGamm_out.txt","r");
f_out= fopen("ELGamm_out2.txt","w");
if(f_in != NULL)
{
while(a||b)//пока а и b не равы 0, считываем a и b
{
fscanf(fin,"%Ld %Ld \n",&a,&b);
MM=b*invmod(powmod(a,X,P),P) % P;//дешифруем считанное
fprintf(f_out,"%c",MM); //сообщение и записываем
} //в файл
}
else printf("No file(read).\n");
fclose(fin);
fclose(f_out);
printf(" input file: 'ElGamm_in'\n");
printf("encrypted file: 'ElGamm_out'\n");
printf("decrypted file: 'ElGamm_out2'\n");
system("PAUSE");
return 0;
}
3.2Результаты выполнения программы.
