Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2014, 20:00   #1
andre_y
 
Регистрация: 24.09.2014
Сообщений: 3
По умолчанию Цифровая подпись RSA Delphi 7

Все доброго вечера. Пишу программу для демонстрации работы ЭЦП RSA, учебную.
Мне надо реализовать самый простым образом ЭЦП. Написал алгоритм шифрования начал писать ЭЦП, никак не получается вычислить подпись.
Прошу помощи.
Ошибка в том, что подпись вычисляется не праведно. Не могу понять почему.

Использую модули FGInt и FGIntRSA.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, FGInt, FGIntRSA, FGIntPrimeGeneration, ComCtrls;

type
  TForm1 = class(TForm)
    lbl1: TLabel;

    redt1: TRichEdit;
    redt2: TRichEdit;
    redt3: TRichEdit;
    redt4: TRichEdit;
    btn7: TButton;
    btn8: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Button2: TButton;
    Label5: TLabel;
    RichEdit1: TRichEdit;
    Button3: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  p,q,fn,i:LongInt;
  e,d,n,nilgint:TFGInt;
  txt:string;
  hashm:string;
  m:string;
  Sing:string;
implementation

{$R *.dfm}
Function HOD(a, b : int64) : int64;
var
  r : int64;
begin
  {если хотя бы одно из чисел равно 0, НОД также равен 0}
  if ((a=0)or(b=0)) then begin
    Result := abs(a+b);
    exit;
  end;
  {оба числа ненулевые}
  r := a-b*(a div b);
  while r <> 0 do begin
    a := b;
    b := r;
    r := a-b*(a div b);
  end;
  Result := b;
end;
Function p_number(X: LongInt): boolean;
var
i: LongInt;
Begin
 if x>1 then
 begin
 Result:=false;
   for i:=2 to trunc(sqrt(x)) do
   if x mod i = 0 then Exit;
 Result:=true;
 end else Result:=false;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
Randomize;
p:=349;{random(400)}
q:=229;{random(300)}
Lbl5.Caption:=IntToStr(p);
Lbl6.Caption:=IntToStr(q);
while not p_number(p)do
dec(p);
while not p_number(q)do
dec(q);
Lbl3.Caption:=IntToStr(p);
Lbl4.Caption:=IntToStr(q);


end;

procedure TForm1.btn2Click(Sender: TObject);
begin
lbl8.Caption:=IntToStr(abs(p*q));
edt2.Text:=IntToStr(abs(p*q));
edt6.Text:=IntToStr(abs(p*q));
fn:=(p-1)*(q-1);
lbl10.Caption:=IntToStr(fn);
end;

procedure TForm1.btn3Click(Sender: TObject);
var i:LongInt;
begin
for i:=2 to fn-1 do
   if HOD(fn,i)=1 then break;
Lbl12.Caption:=IntToStr(i);
Edt1.Text:=IntToStr(i);

end;


procedure TForm1.btn4Click(Sender: TObject);
begin
for i:=1 to StrToInt(lbl8.Caption) do
   if (i*StrToInt(lbl12.Caption))mod
    ((StrToInt(lbl3.Caption)-1)*(StrToInt(lbl4.Caption)-1))=1 then
    break;
lbl14.Caption:=IntToStr(i);
edt5.Text:=IntToStr(i);
end;

procedure TForm1.btn5Click(Sender: TObject);
begin
Base10StringToFGInt(edt1.Text,e);
Base10StringToFGInt(edt2.Text,n);
txt:=redt1.Lines.Text;
RSAEncrypt(txt,e,n,txt);
redt2.Lines.Text:=txt;


end;


procedure TForm1.btn6Click(Sender: TObject);
begin
Base10StringToFGInt(edt5.Text,d);
Base10StringToFGInt(edt6.Text,n);
txt:=redt3.Lines.Strings[0];
RSADecrypt(txt, d, n, Nilgint, Nilgint, Nilgint, Nilgint, txt);
redt4.Lines.Text:=txt;

end;

procedure TForm1.btn7Click(Sender: TObject);
begin
redt3.Lines.Text:=redt2.Lines.Text;
end;

procedure TForm1.btn8Click(Sender: TObject);
begin
btn1.click;
btn2.click;
btn3.click;
btn4.click;
end;
Function md5(s:string):string;{функция вычисления md5 и все, что к ней относится до 366 строки}

procedure TForm1.Button1Click(Sender: TObject);
begin
edit3.text:=md5(Edit2.Text);  //присваевам edit3-ту наш хеш md5
m:=Edit2.Text; //наш текст
hashm:=edit3.text; //наш хеш
end;



procedure TForm1.Button2Click(Sender: TObject);
var
  pz,qz,nz,dz,dp,dq:TFGInt;
  dptemp, dqtemp:Integer;
begin
  dptemp:=15869*349;  //для проверки зафиксировали p и q
  dqtemp:=15869*229;  //для проверки зафиксировали p и q
  Base10StringToFGInt(IntToStr(dptemp),dp);  // d*p
  Base10StringToFGInt(IntToStr(dqtemp),dq); //p*q
  Base10StringToFGInt(lbl14.Caption,dz); //d
  Base10StringToFGInt(lbl8.Caption,nz); //n
  Base10StringToFGInt(lbl3.Caption,pz); //p
  Base10StringToFGInt(lbl4.Caption,qz); //q
RSASign(hashm,dz,nz,dp,dq,pz,qz,Sing);
ShowMessage(Sing);
RichEdit1.Text:=Sing;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  f:Boolean;
begin
RSAVerify(hashm,Sing,e,n,f);
  if f=True then  {проверка подписи}
    ShowMessage('Подпись верна!')
   else
   ShowMessage('Подпись не верна!');

end;

end
Проект во вложении.
Вложения
Тип файла: zip rsa эцп.zip (295.7 Кб, 133 просмотров)

Последний раз редактировалось andre_y; 24.09.2014 в 20:03.
andre_y вне форума Ответить с цитированием
Старый 24.09.2014, 22:07   #2
andre_y
 
Регистрация: 24.09.2014
Сообщений: 3
По умолчанию

Может быть процедуры RSASign и RSAVerify не рабочии в принципе? (а я мучаюсь с ними) У кого есть опыт работы с ними отзовитель пожалуйста.
andre_y вне форума Ответить с цитированием
Старый 25.09.2014, 19:07   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

не любят мемы и прочие raw данные...

Код:
procedure TForm1.btn5Click(Sender: TObject);
var txt64:string;
begin
  Base10StringToFGInt(edt1.Text,e);
  Base10StringToFGInt(edt2.Text,n);
  txt:=redt1.Lines.Text;
  RSAEncrypt(txt,e,n,txt);
  ConvertBase256to64(txt,txt64);
  redt2.Lines.Text:=txt64;
end;


procedure TForm1.btn6Click(Sender: TObject);
var txt64:string;
begin
  ConvertBase64to256(redt2.Lines.Text,txt64);
  Base10StringToFGInt(edt5.Text,d);
  Base10StringToFGInt(edt6.Text,n);
  RSADecrypt(txt64, d, n, Nilgint, Nilgint, Nilgint, Nilgint, txt);
  redt4.Lines.Text:=txt;
end;

в твоем случае e,n - не инициализируются

Код:
...
RSASign(hashm,dz,nz,dp,dq,pz,qz,Sing);
  ConvertBase256to64(Sing,Sing64);
  ShowMessage(Sing64);
...

procedure TForm1.Button3Click(Sender: TObject);
var
  f:Boolean;
  Sing,Sing64:string;
begin
  Sing64:=RichEdit1.Text;
  ConvertBase64to256(Sing64,Sing);
  Base10StringToFGInt(edt1.Text,e);
  Base10StringToFGInt(edt2.Text,n);

  RSAVerify(hashm,Sing,e,n,f);
  if f=True then  {ïðîâåðêà ïîäïèñè}
    ShowMessage('Ïîäïèñü âåðíà!')
   else
   ShowMessage('Ïîäïèñü íå âåðíà!');
end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 25.09.2014 в 19:20.
Slym вне форума Ответить с цитированием
Старый 25.09.2014, 23:01   #4
andre_y
 
Регистрация: 24.09.2014
Сообщений: 3
По умолчанию

Спасибо! Получилось.
andre_y вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цифровая подпись Nonamelol Windows 2 20.11.2013 14:27
Цифровая подпись Antifreem Безопасность, Шифрование 4 13.04.2013 21:19
Цифровая подпись JonMagon Помощь студентам 3 22.07.2011 17:24
Цифровая подпись god110 Общие вопросы Delphi 20 06.07.2010 15:18
цифровая подпись. De-p Microsoft Office Word 0 10.06.2010 17:15