Описание алгоритма:
Для начала решил отладить на небольших числах. Вроде все запрограммировал правильно, но при некоторых значениях начальных велечин все работает, а при других ЭЦП оказывается неверна.
Пример(не работает):
P=659
Q=47
G=571
X=19
K=31
m=4
Пример(работает):
P=983
Q=491
G=739
X=131
K=409
m=от 1 до 33
Цитата |
---|
p – простое число, которое при 512Ј L Ј 1024 удовлетворяет условию 2L-1 < p < 2L, L кратно 64. q – простой делитель p-1, где 2159 < q < 2160. g = h(p-1)/q mod p, где h любое целое, для которого 1 < h < p-1 и h(p-1)/q mod p > 1. x равно случайному или псевдослучайному целому числу, для которого 0 < x < q. y = gx mod p. k равно случайному или псевдослучайному целому числу, для которого 0 < k < q. Целые p, q и g могут быть общедоступными и использоваться группой пользователей. Секретным и открытым ключами являются х и у, соответственно. Параметры х и k используются только для формирования электронной цифровой подписи и должны храниться в секрете. Параметр k генерируется для каждой подписи. Подпись сообщения M представляет собой два числа r и s, вычисленные согласно формулам: r = (g**k mod p) mod q s = (k-1(SHA(M) + xr)) mod q. (здесь k-1 величина обратная k). SHA(M) – представляет собой дайджест сообщения M (160-битовая строка). После вычисления r и s следует проверить, не равно ли одно из них нулю. Для верификации электронной подписи проверяющая сторона должна иметь параметры p, q и g, а также открытый ключ отправителя (подписанта) y. Пусть M, r и s представляют собой полученное сообщение и электронную подпись. Получатель начинает верификацию с проверки условия 0 < r < q и 0 < s < q. Если хотя бы одно из условий не выполнено, электронная подпись некорректна. Далее производится вычисление: w = (s)-1 mod q u1 = ((SHA(M)w) mod q u2 = (®w) mod q v = (((g)u1 (y)u2) mod p) mod q. |
Пример(не работает):
P=659
Q=47
G=571
X=19
K=31
m=4
Пример(работает):
P=983
Q=491
G=739
X=131
K=409
m=от 1 до 33