Материал: Защита информации

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Ключи шифрования и дешифрования вычисляются по алгоритму , где 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.