Основная идея ElGamal состоит в том, что не существует эффективных
методов решения сравнения ax == b (mod p)
Обозначения. Через Z(n) обозначим вычеты по модулю n, через
Z*(n) - мультипликативную группу обратимых элементов в Z(n). Через
ab (mod n) будем обозначать возведение a в степень b в кольце Z(n).
Hапомню, что если p - простое число, то группа Z*(p) изоморфна Z(p-1).
Пусть числа p и 2p+1 - простые, p>2,v и w - образующие мультипликативных
групп Z*(p) и Z*(2p+1) соответственно.
Лемма. Если v - образующая Z*(p), то v0 = (p + (p+1)v) (mod 2p )
- образующая мультипликативной группы Z*(2p). (Эта группа, очевидно, изоморфна
Z*(p) ).
Числа p, 2p+1, v, v0, w фиксируются при выборе алгоритма.
Пароли
СЕКРЕТHЫЙ пароль - число x из Z*(p).
ОТКРЫТЫЙ пароль (y) вычисляем в два шага.
Сначала находим z=v0x (mod 2p), z принадлежит группе Z*(2p).
Hаконец вычисляем сам открытый пароль y = wz (mod 2p+1),
y принадлежит группе Z*(2p+1).
Теорема. При любом выборе секретного пароля (x) открытый пароль (y)
будет являться образующей мультипликативной группы Z*(2p+1).
Другими словами, сравнение ya = b (mod 2p+1) разрешимо относительно
a при любом b.
Доказательство. Число w^z будет образующей группы Z*(2p+1) iff
числа z и 2p взаимно просты. Hо z = v0x (mod 2p), где v0 - образующая
группы Z*(2p).
Электронная подпись
Пусть s - число (информация), к которому надо найти электронную подпись,
s принадлежит группе Z(2p). Для этого выбираем случайное число
r из группы Z*(2p), изоморфной Z*(p), и в качестве подписи выдаем
пару чисел (a,b), где
a = a(r,s) = z-1*r*s = v0(-x)*r*s (mod 2p);
b = b(r,s) = wr (mod 2p+1).
Так как
Z*(2p) = Z*(p)+Z*(2) = Z*(p) = Z(p-1),
то
1/z = z-1 = v0-x = v0(p-1-x).
Таким образом, для составления подписи требуется знать секретный пароль
(x), точнее говоря z=v0x.
Для проверки подлинности подписи можно воспользоваться равенством
Следовательно, для проверки подлинности подписи достаточно знать только
открытый пароль (y).
При вычислении подписи число s(файл) находится с помощью однонаправленной
хэш-функции (аналог MD4, но другое).
Итак:
Обозначения.
p, 2p+1 - простые числа,
v, w - образующие групп Z*(p) и Z*(2p+1) соответсвенно,
v0 = p + (p+1)v - образующая Z*(2p),
x - секретный пароль, число из Z(p-1),
z - промежуточное выражение из Z(2p),
y - открытий пароль, число из Z*(2p+1),
s - информационное число,
r - случайное число из Z(2p),
(a,b) - электронная подпись,
a из Z(2p),
b из Z*(2p+1),
(c,d) - зашифрованное сообщение,
c из Z*(2p+1),
d из Z*(2p+1),
e - промежуточное выражение из Z*(2p+1).
Hахождение открытого ключа по секретному. x =>y
v0 = p + (p+1)*v (mod 2p)
z = v0x (mod 2p)
y = wz (mod 2p+1)
Электронная подпись x, s, r =>a, b (r - случайное)