Освоение механизма шифрования и дешифрования данных в криптографической системе с открытыми ключами RSA

Освоить механизм шифрования и дешифрования данных в криптографической системе с открытыми ключами RSA.

Теоретические основы криптосистем с открытым ключом

RSA – криптографическая система открытого ключа, обеспечивающая такие механизмы защиты как шифрование и цифровая подпись (аутентификация – установление подлинности).

Алгоритм RSA работает следующим образом:

Пусть p и q – два больших различных простых числа, и пусть n = p*q и e некоторое целое, взаимно простое с (p-1)*(q-1).

Оба соответствующих пространства открытых текстов Mk и зашифрованных сообщений Ck суть Zn – множество неотрицательных целых, меньших n. Если подлинное сообщение окажется слишком длинным, чтобы принадлежать Zn, его необходимо разбить на части и зашифровать, используя режим шифрования со сцеплением блоков.

Соответствующая ключу k функция шифрования Ek: Mk -> Ck определяется как Ek(m) = me mod(n). Для того, чтобы полностью определить естественный алгоритм ее вычисления достаточно записать e и n в открытый справочник. Такая пара называется открытым ключом, который легко вычисляется с помощью личного ключа.

Эффективный алгоритм вычисления Dk легко получить, задав дополнительную секретную информацию p и q. С этой целью, используя обобщенные алгоритмы Евклида для нахождения наибольшего общего делителя, чтобы вычислить целое число d, такое что e*d = 1 mod ф(n), где ф(n) = (p-1)*(q-1). По известной теореме Эйлера m(e*d) = m mod(n) для каждого целого числа m и, следовательно, (me) d mod(n) = m, при условии что 0 <= m < n, что обеспечивается, когда m принадлежит Mk.

Функция дешифрования Dk: Ck -> Mk в связи с этим определяется как Dk(c) = md mod(n), и эффективный алгоритм для модульного возведения в степень также может быть использован и для ее вычисления. Тогда каждый пользователь криптосистемы RSA должен раз и навсегда выбрать случайно подходящие целые числа p, q и e и вычислить с их помощью d. После чего он делает свой открытый ключ доступным в пользовательском справочнике, тогда как d сохраняет в секрете. Это дает возможность любому другому пользователю шифровать посылаемые ему сообщения, которые только он и может расшифровать.

Текст программы

unit Main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ComCtrls, StdCtrls;

type

TMainForm = class(TForm)

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

GroupBox2: TGroupBox;

Label6: TLabel;

Label7: TLabel;

CodN: TEdit;

codD: TEdit;

GroupBox1: TGroupBox;

Label2: TLabel;

Label1: TLabel;

CodP: TEdit;

CodQ: TEdit;

Coding: TButton;

DeCoding: TButton;

procedure CodingClick(Sender: TObject);

procedure DeCodingClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

MainForm: TMainForm;

p,q,d: Int64;

e,n,fn: Int64;

Z: Longint;//Параметры кодтрования/декодирования

implementation

{$R *.DFM}

Function NOD(k, l: Int64): Int64;//Определение наибольшого общего делителя

var c:Longint;

Begin

c:=k mod l;

while (c<>0) do

begin

k:=l;

l:=c;

c:=k mod l;

end;

Nod:=l;

End;

procedure TMainForm.CodingClick(Sender: TObject);

Var j,b:byte;

RC:LongWord;

Fb:file of byte;

Fw:file of word;

begin

If (OpenDialog1.Execute)and(SaveDialog1.Execute) then

Begin

AssignFile(Fb,OpenDialog1.FileName);

AssignFile(Fw,SaveDialog1.FileName);

Reset(Fb);

Rewrite(Fw);

Z:=1000;

p:=StrToInt(CodP.Text);

q:=StrToInt(CodQ.Text);

n:=p*q;

fn:=(P-1)*(q-1);

Randomize;

e := Random(Z);

// ПРоцедура поиска взаимно простого числа e с Ф(n)

while (Nod(e,(p-1)*(q-1))<>1) do e := Random(Z);

while ((e*d) mod ((p-1)*(q-1)))<>1 do d := d + 1;

codD.Text:=IntToStr(d);

codN.Text:=IntToStr(n);

While not(eof(Fb)) do

Begin

Read(Fb,b);

RC:=(b*b) mod n;

For j:=3 to e do RC:=(b*RC) mod n;

Write(Fw,RC);

End;

CloseFile(Fw);

CloseFile(Fb);

End;

end;

procedure TMainForm.DeCodingClick(Sender: TObject);

Var j:byte;

b:word;

RC:LongWord;

Fb:file of byte;

Fw:file of word;

begin

If (OpenDialog1.Execute)and(SaveDialog1.Execute) then

Begin

AssignFile(Fw,OpenDialog1.FileName);

AssignFile(Fb,SaveDialog1.FileName);

Reset(Fw);

Rewrite(Fb);

d:=StrToInt(CodD.Text);

n:=StrToInt(CodN.Text);

While not(eof(Fw)) do

Begin

Read(Fw,b);

RC:=(b*b) mod n;

For j:=3 to d do RC:=(b*RC) mod n;

Write(Fb,RC);

End;

CloseFile(Fb);

CloseFile(Fw);

End;

end;

end.


Тестовые примеры

Пример1.

Параметры кодирования: p=19 q=23 n=437 e=13 d=61

Исходный текст

лабораторная работа №4

«Изучение алгоритмов RSA»

по дисциплине «Защита информации»

Кодированный текст

Ÿ

śĽk

ƤĽkž

ťk

śĽƤ

ťt;ŸÞ&ė¹î«åžŽåť

Ÿ%ĽkŽƤĸĽ¨ťƦƩzƧŸÞŎĽťŽàơŽŎŸŽžåť&x

ƥŽƤ

ťŽžÃĽkĸ

ơŽŽƧŸÞ

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100