
- •Содержание
- •2.Краткое описание алгоритма шифра Эль-Гамаля.
- •3.Реализация шифрования дешифрования методом Эль-Гаммеля
- •3.1.Описание основных функций и переменных
- •3.2Результаты выполнения программы.
- •4.Краткое описание алгоритма электронной подписи Диффи-Хеллмана.
- •История
- •Описание алгоритма
- •5. Реализация алгоритма подписи сообщения c помощью системы Диффи-Хеллмана.
- •5.1. Описание основных функций и переменных.
- •5.2Результат выполнения программы.
- •6. Краткое описание алгоритма rc4.
- •7. Реализация алгоритма rc4.
- •7.1. Описание основных функций и переменных.
- •7.2. Результаты выполнения программы.
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;
}