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

5. Реализация алгоритма подписи сообщения c помощью системы Диффи-Хеллмана.

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

#include <iostream>//подключение встроенных библиотек

#include <fstream>

#include <stdio.h>

#include <cstdlib>

#include <math.h>

//using namespace std;

//Diffi-Helman

char str[1024];

void crypt(char cipher[],char k[256])

{ //процедура симметричного шифрования RC4

//шифрованная или дешифровання строка сохраняется

//в глобальной переменной str[1024]

int s[256],t[256];

for(int i=0;i<256;i++)

{

s[i]=i;

t[i]=k[i%strlen(k)]; //strlen(arg)- возврашает длинну

} //строки arg

int j=0;

for(int i=0;i<256;i++)

{

int temp;

j=(j+s[i]+t[i])%256;

temp=s[i];

s[i]=s[j];

s[j]=temp;

}

int m,n,key[256],q;

m=n=0;

int i;

// cout<<"\ndecriptet text"<<endl;

for(i=0;i<strlen(cipher);i++)

{

int temp;

m=(m+1)% 256;

n=(n+s[n])% 256;

temp=s[m];

s[m]=s[n];

s[n]=temp;

q=(s[m]+s[n])%256;

key[i]=s[q];

str[i]=cipher[i]^key[i];

// printf("%c",plaintext[i]);//cout<<plaintext[i];

}

//return plaintext;

}

void int_to_string(__int64 X)

{// записывает каждую цифру число Х в отдельную ячейку str.

FILE* f_temp=fopen("temp.txt","w");

fprintf(f_temp,"%ld",X);//записываем Х в файл

fclose(f_temp);

f_temp=fopen("temp.txt","r");

fscanf(f_temp,"%s",str);//затем считываем его как строку.

fclose(f_temp);

}

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

}

int main()

{

//вычисление секретного ключа

__int64 P,G,a,b,A,B,K_bob,K_alice;

P=65537;//public

G=32768;//public

a=34523;//знает только Боб

b=24357;//знает только Алиса

A=powmod(G,a,P);//значение А вычисляет Боб и передает Алисе

B=powmod(G,b,P);//значение B вычисляет Алиса и передает Бобу

K_bob=powmod(B,a,P);//privat

K_alice=powmod(A,b,P);//privat

int_to_string(K_bob); //меняем формат ключей

char key_bob[256]; //Боба и Алисы на строковый

for(int i=0;i<strlen(str);i++)key_bob[i]=str[i]; //тип.

int_to_string(K_alice); //

char key_alice[256]; //

for(int i=0;i<strlen(str);i++)key_alice[i]=str[i];//

//создание цифровой подписи

__int64 p_pow=1,p=2,H=0;

char ch;

FILE* f_in=fopen("DiffiHelman.txt","r");//открываем для чтения.

FILE* f_out=fopen("DiffiHelman_.txt","w");//сюда запишем подписанное

if(f_in != NULL) //сообщение.

{

while((ch = getc(f_in))!= EOF)//пока не конец файла

{

H+=ch*p_pow; //вычмсляем ХЭШ сообшения

p_pow*=p; //

fprintf(f_out,"%c",ch);//копируем из "DiffiHelman.txt"

} // в "DiffiHelman_.txt"

fprintf(f_out,"%d",0);//стравим разделительный символ 0

int_to_string(H);//меняем формат ХЭШа

crypt(str,key_bob);//Шифруем ХЭШ секретным ключем Боба

fprintf(f_out,"\n%s",str); //добавляем его к сообщению.

}

else printf("Error: No file(DiffiHelman.txt).\n");

fclose(f_in);

fclose(f_out);

//_________________________________

//Проверка подлинности сообщения и подписи

H=0;p_pow=1;

FILE* f = fopen("DiffiHelman_.txt","r");

if(f != NULL)

{

int fl=0,i=0;

while(((ch = getc(f))!= EOF)&&(fl==0))//считываем посимвольно

{

if(ch=='0'){fl=1;}//пока не достигли подписи

if(fl==0)

{

H+=ch*p_pow;//вычисляем ХЭШ

p_pow*=p;

printf("%c",ch);

}else//если достигнута подпись, то

{

fscanf(f,"%s",str);//считываем ее как строку

printf("\n\n______________________\ndigital signature=%s",str);

}

}

}

else printf("Error: No file(DiffiHelman.txt).\n");

fclose(f);

char hash[1024];

char dhash[1024];

crypt(str,key_alice);//дешифруем подпись секретным ключем Алисы

int fl=0;

for(int i=0;i<=strlen(str);i++)

{

dhash[i]=str[i];//записываем дешифрованный ХЭШ в dhash

}

int_to_string(H);//меняем формат вычисленного ХЭШа на строковый

for(int i=0;i<=strlen(str);i++)

{

hash[i]=str[i];

if(hash[i]!=dhash[i])fl=1;//сравниваем дэшифрованный и вычисленный

} //ХЭШи

printf("\ndecriptHASH msg=%s",dhash);

printf("\nmsgHASH=%s\n",hash);

if(!fl)printf("\nVerification OK!\n");

else printf("\nVerification failed!\n");

system("PAUSE");

return 0;

}

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