Ох, спасибо, а я уже другим способом всё проверил :) - сделал шифрование и дешифрование на файлах. Алгоритм работает, значит и мелкие методы пашут.
Но всё равно проверю Maple'ом. Этих корней слишком много для больших простых чисел, потому я ограничился первыми при их вычислении. Тот алгоритм вроде рабочий, на который я ссылался.
Для меня остались загадками некоторые вещи. Уж пусть будет в этой теме. Хоть теперь всё и работает, но я сделал некоторые допущения без какого либо вывода. В книжке написано одно, а вот когда это на ЯВУ пишешь, тут могут быть варианты.
Так вот, пару вопросов, надеюсь я
местный вспомню. При шифровании методом Эль-Гамаля, да и не только им применяется один алгоритм для вычисления формулы:
. Он называется: "Возведение в степень путём последовательного возведения в квадрат" и описан, к примеру, в "Алгоритмы. Построение и анализ. 2-е изд, 2005, на стр.985", либо в первом издании на стр. 758 (на русском языке оба).
Так вот, при шифровании сообщения нужно выполнить операцию:
. Но алгоритм на ЯВУ в таком виде не вычисляет, поэтому я использую такое выражение:
.
Выглядит это так:
// Шаг 1. Выбираем сессионный ключ - случайное целое число k такое, что 1 < k < p - 1
Randomize;
k := Random( p - 3 ) + 2;
Memo1.Lines.Add( 'Шаг 1. Выбираем сессионный ключ - случайное целое число k такое, что 1 < k < p - 1: ' +
IntToStr(k) );
// Вычисляем числа a = g^k mod p и b = y^k * M mod p
a := ModularExponentiation( g, k, p );
Memo1.Lines.Add( 'Шаг 2. Вычисляем число a = g^k mod p: ' + IntToStr(a) );
EditAValue.Text := IntToStr(a);
b := StrToInt( Edit1.Text ) * ModularExponentiation( y, k, p ) mod p;
Memo1.Lines.Add( 'Шаг 3. Вычисляем число b = M * y^k mod p: ' + IntToStr(b) );
EditBValue.Text := IntToStr(b);
// Пара чисел (a, b) является шифротекстом.
Memo1.Lines.Add( 'Пара чисел (a, b) является шифротекстом: (' +
IntToStr(a) + ', ' + IntToStr(b) + ')' );
Переменная
b содержит вторую часть шифротекста. Так вот, насколько это правильно, делать так, как я сделал? Я заранее знаю, что это работает, но вот с модульной арифметикой не очень знаком. Может книжка какая есть? Или это весь курс дискретной математики нужно проходить?
Ещё один вопрос есть, который в Википедии поставил меня в тупик. Там при дешифровке нужно вычислить выражение в виде:
. Опять же в книжке я нашёл, что это эквивалентно:
. Это вроде как само собой подразумевается?