Создание и проверка ЭЦП документа

Постановка задачи

Разработать программу, позволяющую создать ЭЦП, а также программу, осуществляющую проверку правильности ЭЦП.

Основные теоретические сведения

 ВЫБОР ПАРАМЕТРОВ СИСТЕМЫ ЭЦП

Параметры системы ЭЦП – числа p,q,a. Эти числа не являются секретными. Конкретный набор их значений может быть общим для группы пользователей.

1.Выбрать простое число p.

2. Выбрать число q так, чтобы q являлось простым делителем числа p-1.

3 .Выработать число a следующим образом:

а) произвольно выбрать число d: 1<d<p-1

б) вычислить f=dp-1/q mod p

в) если f=1, то перейти к а). Если f<>1, то a:=f.

4.Выбрать секретный ключ x.

5. Вычислить открытый ключ пользователя y=ax mod p.

АЛГОРИТМ ВЫРАБОТКИ ПОДПИСИ

1.Вычислить h(M) – значение хеш-функции от каждой строки сообщения М как контрольная сумма 1 в строке сообщения. Если h(M) mod q = 0, присвоить h(M) = 1.

2.Выбрать целое число 0<k<q – секретный ключ

3. Вычислить два значения: r=ak mod p и r1=r mod q. Если r1=0 перейти к п.3.2 и выработать другое значение числа k.

4.С использованием секретного ключа x пользователя вычислить значение s=(x*r1+k*h(M)) mod q. Если s=0 перейти к п.2, в противном случае – конец.

5.Подписью сообщения является вектор <r1>II<s>.

АЛГОРИТМ ПРОВЕРКИ ПОДПИСИ

1.Проверить условие 0<s<q , 0<r1<q. Если хотя бы одно из условий не выполнено, подпись считается недействительной.

2.Вычислить h(M1) – значение хеш-функции от каждой строки полученного сообщения М1 как контрольную сумму 1 в строке сообщения. Если h(M) mod q = 0, присвоить h(M) = 1.

3 Вычислить значение V=(h(M1)) q-2 modq

4Вычислить значения Z1=SV mod q

Z2=(q-r1)Vmod q

5.Вычислить значение U=(az1yz2(mod p))(mod q)

6.Проверить условие r1=u

При совпадении значений u и r1 получатель принимает решение о том, что полученное сообщение подписано данным отправителем и в процессе передачи не нарушена целостность сообщения, т.е. М=М1 . В противном подпись считается недействительной.

Выполнение работы

Проверим правильность работы программы на следующих примерах:

clip_image002

Если изменить значение ЭЦП, то при проверке корректности ЭЦП будет сформировано сообщение об ошибке ЭЦП.


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

unit Unit1;

interface

uses

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

StdCtrls;

type

TFlexByte = array of byte;

TForm1 = class(TForm)

Label1: TLabel;

Edit1: TEdit;

Label2: TLabel;

Edit2: TEdit;

Label3: TLabel;

Edit3: TEdit;

Label4: TLabel;

Edit4: TEdit;

Button1: TButton;

Button2: TButton;

OpenDialog1: TOpenDialog;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

const

p:word = 31;

q:word = 5;

var

Form1: TForm1;

a:word;

secretKey:word;

openKey:word;

implementation

{$R *.DFM}

function CheckSum(a:TFlexByte):word;

var

i,j:integer;

tmp:byte;

begin

result:=0;

for i:=Low(a) to High(a) do

begin

tmp:=a[i];

for j:=0 to 7 do

begin

if (tmp and 1)<>0 then

result:=result+1;

tmp:=tmp shr 1;

end;

end;

end;

function PowerMod(a:word;b:word;c:word):word;

var

tmp,i:word;

begin

if b=1 then

begin

result:=a mod c;

Exit;

end;

tmp:=(a*a) mod c;

for i:=3 to b do

begin

tmp:=(a*tmp) mod c;

end;

result:=tmp;

end;

function PowerWord(w:word;p:word):word;

var

i:integer;

begin

result:=1;

for i:=1 to p do

result:=result*w;

end;

function Signature(const msg:TFlexByte;var r1:byte;var s:byte;var x:word;var y:word):word;

label

M1,M2;

var

d,f,k,r:word;

begin

// Generate a

Randomize;

M1:

d:=0;

while (d=0)or(d=(p-1)) do

d:=Random(p-1);

f:=PowerMod(d,(p-1)div q, p);

if f=1 then

goto M1

else

a:=f;

// Secret key X | Open key Y

x:=0;

while (x=0)or(x=q) do

x:=Random(q);

y:=PowerMod(a, x, p);

// Calc hash

result:=CheckSum(msg);

if (result mod q)=0 then

result:=1;

// Calc r | r1

M2:

k:=0;

while (k=0)or(k=q) do

k:=Random(q);

r:=PowerMod(a,k,p);

r1:=r mod q;

if r1=0 then

goto M2;

// Calc s

s:=(x*r1+k*result) mod q;

if s=0 then

goto M2;

y:=(y shl 8)+a;

end;

function CheckSignature(msg:TFlexByte;r1:byte;s:byte;y:word;var chs:word):boolean;

var

v,z1,z2,u: word;

begin

result:=false;

if (s>0)and(s<q)and(r1>0)and(r1<q) then

begin

chs:=CheckSum(msg);

if (chs mod q)=0 then

chs:=1;

a:=openKey and 255;

y:=openKey shr 8;

v:=PowerMod(chs,q-2,q);

z1:=(s*v)mod q;

z2:=((q-r1)*v) mod q;

u:=(PowerWord(a,z1)*PowerWord(y,z2)mod p)mod q;

result:=(r1=u);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

f:file of byte;

fb:TFlexByte;

signL,signH:byte;

i:integer;

begin

if OpenDialog1.Execute then

begin

AssignFile(f,OpenDialog1.FileName);

Reset(f);

SetLength(fb,FileSize(f));

for i:=Low(fb) to High(fb) do

Read(f,fb[i]);

Edit2.Text:=IntToStr(Signature(fb,signL,signH,secretKey,openKey));

Edit1.Text:=IntToStr(signL)+’ ‘+IntToStr(signH);

Edit3.Text:=IntToStr(secretKey);

Edit4.Text:=IntToStr(openKey);

Write(f,signL);

Write(f,signH);

CloseFile(f);

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

f:file of byte;

fb:TFlexByte;

signL,signH:byte;

i:integer;

chs:word;

res:boolean;

begin

if OpenDialog1.Execute then

begin

AssignFile(f,OpenDialog1.FileName);

Reset(f);

SetLength(fb,FileSize(f)-2);

for i:=Low(fb) to High(fb) do

Read(f,fb[i]);

Read(f,signL);

Read(f,signH);

CloseFile(f);

Edit1.Text:=IntToStr(signL)+’ ‘+IntToStr(signH);

openKey:=StrToInt(Edit4.Text);

res:=CheckSignature(fb,signL,signH,openKey,chs);

Edit2.Text:=IntToStr(chs);

if res then

ShowMessage(‘проверка завершена успешно ‘)

else

ShowMessage(‘проверка завершена неуспешно’);

end;

end;

end

.

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

3 коммент. »

 
  • GenDolf says:

    Скажите пожалуйста, какой алгоритм используется в этой работе? RSA, DSA или ещё какой?

  • Toma says:

    Это общий принцип формирования ЭЦП (для лабораторки делался) без использования шифрования. Если интересно вот по этой диаграмме, только без использования шифрования с открытым ключемю

  • Toma says:

    никакой алгоритм шифрования не применяется

 

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

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