Описание основных переменных и функций криптографического протокола «Электронные деньги». Пример работы программы
Int gcda (int a, int b) — Проверка на взаимную простоту. Если подпись верна, условие выполняется. Функция быстрого возведения в степень. Int pprime (int number) — подбор простого числа P. Int bist (int a, int chislo, int p, int m) — a ^ chislo * m mod p. Cout << «Подпись не подлинная» << endl; U = (h — (x * r) % (P — 1) + P — 1) % (P — 1); Проверка на взаимную простоту. Cout << «Подпись… Читать ещё >
Описание основных переменных и функций криптографического протокола «Электронные деньги». Пример работы программы (реферат, курсовая, диплом, контрольная)
Функции:
int gcda (int a, int b) — Проверка на взаимную простоту.
int gcd (int a, int b) — обощенный алгоритм Евклида:? * d mod p = 1.
int pprime (int number) — подбор простого числа P.
int bistr (int a, int chislo, int p) — функция быстрого возведения в степень.
int bist (int a, int chislo, int p, int m) — a ^ chislo * m mod p.
Переменные:
int P, Q, F, d, c, n, r, nn, ss, N, s, schetshop, schetshop — переменные необходимые для работы программы;
Программный код электронной подписи на базе шифра Эль-Гамаля
#include.
#include.
#include.
#include.
#include.
using namespace std;
//подбор простого числа P.
int pprime (int number).
{.
int count;
while (count ≠ 2).
{.
count = 0;
for (int i = 1; i <= number; i++).
{.
if (number % i == 0).
count++;
if (count > 2).
{.
number++;
break;
}.
}.
}.
return number;
}.
//функция быстрого возведения в степень.
int vozved (int a, int chislo, int p).
{.
int b;
int y = 1;
int t = log2 (chislo);
for (int i = 0; i < t+1; i++).
{.
b = chislo % 2;
chislo = chislo / 2;
if (b == 1).
y = y * a;
a = (a * a) % p;
}.
return y % p;
}.
// Проверка на взаимную простоту.
int vzprost (int a, int b).
{.
int q;
int u [3] = { a, 1, 0};
int v [3] = { b, 0, 1};
int T [3];
int c;
while (v [0] ≠ 0).
{.
c = u [0] / v [0];
T [0] = u [0] % v [0];
T [1] = u [1] - c * v [1];
T [2] = u [2] - c * v [2];
for (int i = 0; i ≠ 3; i++).
{.
u [i] = v [i];
v [i] = T [i];
}.
}.
return u [0];
}.
//обощенный алгоритм Евклида.
int evklid (int a, int b).
{.
int q, c;
int u [3] = { a, 1, 0};
int v [3] = { b, 0, 1};
int T [3];
while (v [0] ≠ 0).
{.
c = u [0] / v [0];
T [0] = u [0] % v [0];
T [1] = u [1] - c * v [1];
T [2] = u [2] - c * v [2];
for (int i = 0; i ≠ 3; i++).
{.
u [i] = v [i];
v [i] = T [i];
}.
}.
q = a + u [2];
return q;
}.
int main ().
{.
setlocale (0, «»);
nt m = 18;
//Подбор чисел P и G (подробнее стр. 19 — верх, 20 — середина).
int P, q, G;
q = rand () % 30;
q = pprime (q);
P = (2 * q) + 1;
G = 2 + rand () % (P — 1);
if (vozved (G, q, P) == 1).
G++;
int x;//держит в секрете.
x = 2 + rand () % (P-1);
int y;
y = vozved (G, x, P);//публикует в качестве открытого ключа.
//вычисление хэш-функции.
int h = vozved (2, m, P);
int k;
k = 1 + rand () % (P / 2);
for (;;).
{.
if (vzprost (k, (P — 1)) == 1).
break;
else.
k++;
}.
int r, u, s;
r = vozved (G, k, P);
u = (h — (x * r) % (P — 1) + P — 1) % (P — 1);
int kmin1;
kmin1 = evklid (P — 1, k);
s = (kmin1 * u) % (P-1);
///отправляем подписанное сообщение др пользователю.
int rez = vozved (y, r, P);
int rez1 = vozved (r, s, P);
int rezult = rez * rez1% P;
//если подпись верна, условие выполняется.
if (rezult == vozved (G, h, P)).
cout << «Подпись подлинная» << endl;
else.
cout << «Подпись не подлинная» << endl;
system («pause»);
}.