Ключи шифрования и дешифрования
вычисляются по алгоритму
, где P -
большое простое число, g - первообразный корень по модулю P. Секретное число a
может быть любым целым числом, лучше случайным. Величина числа не ограничена.
Первообразным (примитивным) корнем
по модулю P, будет число g < P и взаимно простое с P, принадлежащее
показателю d. Показатель d (дискретный логарифм числа g по модулю P при
основынии i т.е
или
) является
наименьшим, натуральным числом, обеспечивающим сравнение
. Отсюда
следует, что для взаимно простых P и
= P-1 чисел показатель (индекс)
и
следовательно
, где: i =
2,3,4,…,P-2. Исходя из того факта, что первым основанием i, (для простого P и
взаимно простого
) образующим
первый примитивный корень могут быть только числа 2 и 3, следовательно,
вычислить первый корень не составляет труда. Например, для модуля P=11, первым
корнем будет число 2, так как:
=
, где:
и d = 5 =
. Для модуля
P = 7 первым корнем будет число 3^3(mod 7) = 6, а вторым корнем будет, 5^3(mod
7) = 6.
Первообразные корни образуют
мультипликативную группу кольца
, которая представляет ряд чисел,
степени которых g0, g1, g2,…g φ(m)-1
представляет собой совокупность всех взаимно простых с m чисел, меньших m. То
есть gk пробегает систему вычетов при k = 1, 2,… φ(m), где: φ(m) - функция
Эйлера.
В программе использовала компоненты
SpinEdit 1,2,3- для ввода чисел, Memo 1,2 - для отображения результатов и
командные кнопки Button 1,2. (рис. 9)
Рис. 9
Примечание: Для вычисления значенией действительных чисел в раздел Uses Unit’aвключить модуль Math.
Реализация алгоритмов
Simple(n:integer):Boolean;k:Boolean;
i:integer;:=true;n<>2 theni:=2 to trunc(sqrt(n))+1 don mod i = 0 then:=
false;;;:=k;;IntModPower(A,B,P:integer):integer;:array of
integer;:integer;(x,P);[1]:=A mod P;i:=2 to B do[i]:=x[i-1] * A mod
P;:=x[B];;TForm1.Button1Click(Sender: TObject);:integer;.Clear;i :=
SpinEdit1.Value to SpinEdit2.Value doSimple(i) = true then
Memo1.Lines.Add(IntToStr(i));;TForm1.Button3Click(Sender: TObject);,d,P:
integer;.Clear;:= SpinEdit3.Value;:= (P-1) div 2;i := 2 to P-2
do(IntModPower(i,d,P) = P-1) then.Lines.Add('g = ' + IntToStr(i) + ' (^' +
IntToStr(d) + ') = ' + FloatToStr(Power(i,d)));;
.
Вычисление значения ХЭШ функции сообщения
Вычисление
значения ХЭШ функции выполняется методом посимвольной свертки сообщения в
соответствии с алгоритмом:
, где:
- начальное
значение функции,
- текущие
символы сообщения (таблица ASCII).
Приложение (рис. 1) содержит два поля ввода Edit1 и Edit2, кнопку Button1 и две метки Label1 и Label2. Исполняемый код реализован в обработчике события щелчка кнопки onClick.
Рис.
10 Дизайн приложения
.
Криптографический алгоритм “Псевдослучайная последовательность ключа”
Алгоритм основан на псевдослучайной последовательности:
равной
длине сообщения M, значения которой принадлежат алфавиту длиной L. Где:
параметр а, взаимно простой с M;
;
, i = 1, 2,…,N < M.
При
этом общая процедура шифрования имеет вид:
или
Приложение (рис. 2), реализующее алгоритм содержит:
Сетку StringGrid1, предназначенную для отображения собственного алфавита, пять полей ввода Edit1 - Edit5, поле ввода секретного числа - SpinEdit1, три кнопки Button1 - Button3 и метки Label1 - label5 статически описывающие назначение полей.
Рис
11. Дизайн приложения.
Личный
алфавит описан глобальной константой A.
Для
реализации алгоритма использовала три личных метода. Процедура RND_CODE
вычисляет последовательность ПСЧ. Функция ALNo возвращает номер символа в
алфавите. Функция NoAL возвращает символ, соответствующий номеру символа в
алфавите.
Вывод
алфавита в сетку выполнила при помощи создания формы в обработчике события
onCreate.
Процедура шифрования реализована в обработчике события onClick кнопки Button1.
Процедура дешифрования реализована в обработчике события onClick кнопки Button2.
Процедура
очистки полей реализована в обработчике события onClick кнопки Button3.