Сделай Сам Свою Работу на 5

Описание основных функций и переменных





#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;

}

 

Результаты выполнения программы.

 

 

 

Краткое описание алгоритма электронной подписи Диффи-Хеллмана.

Алгоритм Ди́ффи — Хе́ллмана — алгоритм, позволяющий двум сторонам получить общий секретный ключ, используя незащищенный от прослушивания, но защищённый от подмены канал связи. Этот ключ может быть использован для шифрования дальнейшего обмена с помощью алгоритма симметричного шифрования.



Алгоритм был впервые опубликован Уитфилдом Диффи и Мартином Хеллманом в 1976 году.

В 2002 году Хеллман предложил называть данный алгоритм «Диффи — Хеллмана — Меркля», признавая вклад Меркля в изобретение криптографии с открытым ключом.

История

Схема обмена ключами Диффи — Хеллмана, изобретённая в 1976 году при сотрудничестве Уитфилда Диффи и Мартина Хеллмана, под сильным влиянием работы Ральфа Меркля (Ralph Merkle) о системе распространения публичных ключей, стала первым практическим методом для получения общего секретного ключа при общении через незащищенный канал связи. Для обеспечения устойчивости, по совету Джона Гилла (John Gill), была использована проблема дискретного логарифмирования.

Годом позже был изобретен первый алгоритм асимметричного шифрования RSA, который решил проблему общения через незащищённый канал кардинально.

В декабре 1997 года была обнародована информация, что в 1974 году Малькольм Вильямсон изобрел математический алгоритм, основанный на коммутативности показателей при последовательном возведении в степень (то есть, ), аналогичный алгоритму Диффи-Хеллмана.

Описание алгоритма

Предположим, что обоим абонентам известны некоторые два числа g и p (например, они могут быть «зашиты» в программное обеспечение), которые не являются секретными и могут быть известны также другим заинтересованным лицам. Для того, чтобы создать неизвестный более никому секретный ключ, оба абонента генерируют большие случайные числа: первый абонент — число a, второй абонент — число b. Затем первый абонент вычисляет значение и пересылает его второму, а второй вычисляет и передаёт первому. Предполагается, что злоумышленник может получить оба этих значения, но не модифицировать их (то есть у него нет возможности вмешаться в процесс передачи). На втором этапе, первый абонент на основе имеющегося у него и полученного по сети вычисляет значение , а второй абонент на основе имеющегося у него и полученного по сети вычисляет значение . Как нетрудно видеть, у обоих абонентов получилось одно и то же число: . Его они и могут использовать в качестве секретного ключа, поскольку здесь злоумышленник встретится с практически неразрешимой (за разумное время) проблемой вычисления по перехваченным и , если числа выбраны достаточно большими.



Алгоритм Диффи — Хеллмана, где K — итоговый общий секретный ключ

При работе алгоритма, каждая сторона:

1. генерирует случайное натуральное число aзакрытый ключ

2. совместно с удалённой стороной устанавливает открытые параметры p и g (обычно значения p и g генерируются на одной стороне и передаются другой), где

p является случайным простым числом

g является первообразным корнем по модулю p

3. вычисляет открытый ключ A, используя преобразование над закрытым ключом

A = ga mod p

4. обменивается открытыми ключами с удалённой стороной

5. вычисляет общий секретный ключ K, используя открытый ключ удаленной стороны B и свой закрытый ключ a

K = Ba mod p

К получается равным с обеих сторон, потому что:

Ba mod p = (gb mod p)a mod p = gab mod p = (ga mod p)b mod p = Ab mod p

В практических реализациях, для a и b используются числа порядка 10100 и p порядка 10300. Число g не обязано быть большим и обычно имеет значение в пределах первого десятка.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.