سلام عليكم اذا امكن تفسير عمل الكود وطريقة عمل sha-1 ولكم جزيل الشكر
#include "stdio.h"
#include "stdlib.h"
#define kr 1000
union u{
unsigned long h2;
char h3[4];
} uu;
char M[12] = {"Work for PK"};
unsigned long q, b, p, x, y, a;
unsigned long p1, mp[kr];
unsigned long k, r,h1, s, h_1;
unsigned long u1, u2, v, v1;
int i, j, j1;
/////////////////////
int simple(unsigned long m, int k){
unsigned long n;
int k1, pr;
k1 = k;
k1--; pr = 0;
while( k1 >= 0){
n = mp[k1];
n = m % n;
if(n == 0){
pr = 0;
return pr;
}
else
pr++;
k1--;
}
mp[k] = m;
return pr;
}
////////////////////////
void m_simple(){
unsigned long m;
i = 2;
j = 3;
while(j < kr){
m = mp[j-1];
m++;
while(!simple(m,j)){
m++;
}
j++;
}
}
//////////////////////////////
void p_q_a(){
unsigned long mn;
unsigned long k1;
a = 2;
do{
mn = 1; k1 = 1;
while(k1 != q){
mn *= a;
k1++;
}
a++;
}while((mn % p) != 1);
return;
}
/////////////////////////////
unsigned int hash(char A){
unsigned int h, g;
h = g = 0;
h = (h << 4) + A;
if( g == (h & 0xF0000000)){
h = h ^ (g >> 24);
h = h ^ g;
h = h % 211;
}
return h;
}
////////////////////////////////
void main(){
int pp1;
unsigned long p1;
for(i = 0; i < 12; i++){
printf("%c ", M);
}
printf("\n");
mp[0] = 2; mp[1] = 3; mp[2] = 5;
m_simple();
printf("Vvedite celoe chislo, posle kotorogo mozhno vzjat prostoe chislo\n");
scanf("%i", &pp1);
///////////////////////////
p1 = pp1;
i = 0;
while(mp <= pp1)
i++;
q = mp;
printf("q = %i \n", q);
j = i + 1;
while((j <= kr) && ((mp[j] % q) != 1))
j++;
if(j <= kr)
p = mp[j];
else
return;
printf("p = %i \n", p);
b = p / q;
printf("b = %i \n", b);
p_q_a();
printf("a = %i \n", a);
x = rand() % q;
printf("x = %i \n", x);
y = 1; p1 = 1;
while(p1 <= x){
y *= a;
p1++;
}
y = y % p;
printf("y = %i \n", y);
h1 = hash(M[0]);
printf("m = %c h = %i \n", M[0], h1);
do{
k = rand() % q;
r = 1; p1 = 1;
while(p1 <= k){
y *= a;
p1++;
}
r = (y % p) % q;
s = (k * h1 + x * r) % q;
}while((r == 0) || (s == 0));
printf("k = %i \n", k);
printf("<m %c, r %i, s %i> \n", M[0], r, s);
/////////////////////////////////
uu.h2 = h1;
h_1 = hash(uu.h3[0]);
h_1 = (1 / h_1) % q;
printf("h_1 %i \n", h_1);
if((r < 0) || (r >= q)){
printf("Error r");
return;
}
if((s < 0) || (s >= q)){
printf("Error s");
return;
}
u1 = (s * h_1) % q;
u2 = ((-r) * h_1) % q;
printf("u1 = %i u2 %i \n", u1, u2);
v = 1; p1 = 1;
while(p1 <= u1){
y *= a;
p1++;
}
v1 = 1; p1 = 1;
while(p1 <= u2){
v1 *= y;
p1++;
}
v = ((v * v1) % p) % q;
if(v == r)
printf("v %i = r %i \n", v, r);
else
printf("v %i <> r %i \n", v, r);
return;
}