fy"> {//ф-ція розкладання на множники, але тільки вона 2 множітеля__int64 d, temp, x [2], y [2], c;
{= ((rand () <<16) | rand ())% (Mod-1);// вибираючи випадкове з
} while (! c);
{[0] = ((rand () <<16) | rand ())% (Mod-1);// і випадкове х для початку алгоритму
} while (! x [0]); [0] = x [0];
{[1] = Sravn (x [0], c, Mod);// на кожній ітерації х_i = f (x_ (i-1)) [0] = x [1];// f (x ) - це і є ф-ція Sravn () [1] = Sravn (y [0], c, Mod);// а y_i = f (f (y_ (i-1))) [1] = Sravn ( y [1], c, Mod); [0] = y [1]; (x [1]> y [1]) = x [1] - y [1]; = y [1] - x [ 1]; = NOD (Mod, temp);// п оалгорітму треба назодіть НСД різниці х і у поточних (d == Mod)// це якщо Mod - простое1;
} while (d == 1); = d; = Mod/P; 0;
}
void GetQ (unsigned int P, unsigned int & q)
{int p1, p2;// знаючи Р, знаходимо для нього q, таке що q | Р-1Err;
{= Factor (P, p1, p2);// на кожній ітерації факторізіруем число = (p1> p2)? p1: p2;// і вибираємо найбільше з результатів
} while (! Err);// до тих пір поки не отримаємо просте = P;// його і приймаємо за q
}
void GenOpenParam (unsigned int & P, unsigned int & q, unsigned int & b)
{int temp;
{
{= (rand () <<16) | rand ();// снчала знаходимо просто просте число
} while (NoPrime (P)); * = 2, P + = 1;// потім за умовою сильного протсо
} while (NoPrime (P)); (P, q); (b = P-1; b> = 1; b-)// а бету знаходимо методом перебору
{(b, q, temp, P); (temp == 1);
}
}
void GetKeysA (unsigned int P, unsigned int q, unsigned int b, unsigned int & a, unsigned int & v)
{//генерація ключів для А-абонентаint temp;
{= (rand () <<16) | rand ();
} while (! a); (b, a, temp, P); (P, temp, v);
}
void Sign (unsigned int P, unsigned int q, unsigned int b, unsigned int a, FILE * File, unsigned int & e, unsigned int & y)
{//ф-ція подпісиваніяint r, x; __int64 temp; char * S; FileLen;
{= (rand () <<16) | rand ();
} while (! r); (b, r, x, P); (File, 0, SEEK_END);// ставимо покажчик у кінець файлу = ftell (File);// знаходимо його позицію в байтах (таким чином і довжину самого файлу) (File, 0, SEEK_SET);// і повертаємося назад в початок = new unsigned char [FileLen + 4];/​​/ 4 доп байта для слеіванія рядки з x (S +4, sizeof (unsigned char ), FileLen, File); [0] = (x>> 3 * 8) & 0xff;// ось ттакім чином склеюємо рядок зі значенням x [1] = (x>> 2 * 8) & ; 0xff; [2] = (x>> 1 * 8) & 0xff; [3] = (x>> 0 * 8) & 0xff; = CRC32Count (S, (FileLen +4)) ;// і знаходимо хеш функцію від неї = a * e;% = q; + = r;% = q; = temp; [] S;
}
bool CheckSign (unsigned int P, unsigned int b, unsigned int v, unsigned int e, unsigned int y, FILE * File)
{//майже те ж, що і при подпісиваніі__int64 temp; int Rez1, Rez2, z, FileLen, e1; char * S; (b, y, Re...