Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Federalnoe_agentstvo_svyazi_R1.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
300 Кб
Скачать
☆

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Результаты выполнения программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]