-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsigner.cpp
More file actions
158 lines (147 loc) · 5.23 KB
/
signer.cpp
File metadata and controls
158 lines (147 loc) · 5.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <stdlib.h>
#include <time.h>
#include <string>
using std::string;
#include <sstream>
using std::stringstream;
#include <fstream>
using std::fstream;
#include "common.h"
/* Функция выполняет вычисление подписи */
void form_pod(int len, const WORD *g1, const WORD * HH, const WORD *skl, WORD *R1, WORD *S1);
bool verbose;
int main(int argc, const char * argv[]){
verbose = argc==1;
WORD Y[LEN1], GG[LEN1], X3[LEN1], X4[LEN1], HH[LEN1], R1[LEN1], S1[LEN1];
//вывод P,Q
if(verbose)
cout<<"P = "<<endl<<hex_mas(11,PP)<<endl
<<"q = "<<endl<<hex_mas(11,QQ)<<endl;
// вычисление G=Hnach^[(P-1)/Q](mod P)
minus(LEN1,PP,ODIN,X3); //X3 = PP-1
Div(LEN1,X3,QQ,X4); //X4 = X3/QQ
step_mod(PP,Hnach,LEN1,X4,LEN1,GG); //GG = pow(Hnach,X4)%PP
if(verbose){
cout<< "вычисление G=Hnach^[(P-1)/Q](mod P)"<<endl;
cout << "G = "<<hex_mas(LEN1,GG)<<endl ;
//проверка модуля Р: G^Q=1(mod P)
cout<< "проверка модуля Р: G^Q=1(mod P)"<<endl;
step_mod(PP,GG,LEN1,QQ,LEN1,X3);//X3 = pow(GG,QQ)%PP
cout<<"G^Q = "<<hex_mas(LEN1,X3)<<((cmp(11,X3,ODIN))?" - OK":" - что-то пошло не так")<<endl<<endl;
}
char infilename[1000], outfilename[1000];
if(verbose){
//прочитать имя входного/выходного файла
cout<<"Введите имя входного файла"<<endl;
cin>>infilename;
cout<<"Введите имя выходного файла"<<endl;
cin>>outfilename;
//вывести пример закрытого ключа
cout<<"введите фиксированную часть закрытого ключа, например такой:"<<endl;
cout<<hex_mas(10,XX)<<endl;
//заполнить XX - 1я часть закрытого ключа
cin>>hex_mas(10,XX);
cout<<"прочитано: "<<endl;
cout<<hex_mas(10,XX)<<endl;
mod_p(XX,LEN1,QQ,LEN1);
//прочесть или случайно сгенерировать k - 2я часть закрытого ключа
cout<<"введите случайную часть закрытого ключа, \nесли не укажите, она будет сгенерирована случайно"<<endl;
char s[100];
cin.getline(s,100);
cin.getline(s,100);
if(*s==0){
srand(time(0));
for(int i=0; i<10; i++)
k[i]=(WORD)rand();
cout<<"сгенерировано: "<<endl;
}
else{
stringstream str((string)s);
str>>hex_mas(10,k);
cout<<"прочитано: "<<endl;
}
mod_p(k,LEN1,QQ,LEN1);
cout<<hex_mas(10,k)<<endl;
}
else
;//разобрать параметры
//Вычисление открытого ключа по секретному ключу
step_mod(PP,GG,LEN1,XX,LEN1,Y); //Y = pow(GG,XX)%PP
if(verbose)
cout<<endl << "Открытый ключ Y=G^x(mod P) = "<<endl;
cout<<hex_mas(10,Y)<<endl;
FILE * in_f = fopen(infilename,"r");
if(!in_f){
cerr <<"не могу открыть файл "<<infilename<<", останов"<<endl;
exit(2);
}
file_hash(in_f,HH,verbose);
if(verbose){
cout<<"хэш входного файла = "<<endl;
cout<<hex_mas(10,HH)<<endl;
}
form_pod(LEN1, GG, HH, k, R1, S1);
if(verbose){
cout<<endl<<"-Подпись сообщения-"<<endl
<<"Компонента R = "<<hex_mas(10,R1)<<endl
<<"Компонента S = "<<hex_mas(10,S1)<<endl;
}
fclose(in_f);
//записать в файл
{
fstream out_f(outfilename,std::fstream::out);
if(!out_f){
cerr <<"не могу открыть файл "<<outfilename<<", останов"<<endl;
exit(2);
}
out_f<<hex_mas(10,R1)<<endl<<hex_mas(10,S1)<<endl;
}
{
FILE * in_f=fopen(infilename,"r"), * out_f=fopen(outfilename,"a");
if(!out_f){
cerr <<"не могу открыть файл "<<outfilename<<", останов"<<endl;
exit(2);
}
if(!in_f){
cerr <<"не могу открыть файл "<<infilename<<", останов"<<endl;
exit(2);
}
char arr[10000];
while(!feof(in_f)){
fgets(arr,10000,in_f);
fputs(arr,out_f);
}
fclose(in_f);
fclose(out_f);
if(verbose)
cout<<"подписанный файл создан"<<endl;
}
if(verbose)
cout<<endl << "Открытый ключ Y=G^x(mod P) = "<<endl
<<hex_mas(10,Y)<<endl;
#ifdef MSC_VER
if(verbose){
cout <<endl <<endl <<"нажмите любую клавишу... "<<endl;
getchar();
cout<<endl;
}
#endif
}
/* Функция выполняет вычисление подписи */
void form_pod(int len, const WORD *g1, const WORD * HH, const WORD *skl, WORD *R1, WORD *S1)
{
WORD M[LEN1],X5[2*LEN1],X6[LEN1];
/* 2) Вычисление R компонеты подписи = pow(g,k)%p%q */
step_mod(PP,g1,len,skl,len,R1); //R1 = pow(g1,skl)%PP
mod_p(R1,len,QQ,len); //R1%= QQ
/* 3) Вычисление S компоненты подписи = ( (k^-1 mod q)*(h+x*r) )%q */
umn(XX,len,R1,len,X5,2*len); //X5 = XX*R1
mod_p(X5,2*len,QQ,LEN1); //X5%= QQ
plus(len,X5,HH,X6); //X6 = X5+HH
mod_p(X6,len,QQ,LEN1); //X6%= QQ
obr(len,skl,QQ,M); //M = (skl^-1 mod QQ)
umn(X6,len,M,len,X5,2*len); //X5 = X6*M
mod_p(X5,2*len,QQ,LEN1); //X5%= QQ
memcpy(S1,X5,len*sizeof(WORD)); //S1 = X5
return;
}