| 
| 
 | Вопрос # 2 791/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Есть программа шифрования RSA. На форме 3 Memo и кнопки шифровать и дешифровать. В первое Memo вводим текст, нажимаем шифровать, во второе выводится шифр. Нажимаем дешифровать и в третье выводится расшифрованный текст. Но если, к примеру, шифр из второго Memo скопировать, перезапустить программу и вставить обратно, то этот текст уже не расшифровывается. Подскажите, пожалуйста, что нужно изменить в коде
 Приложение:Переключить в обычный режим unit Unit16;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ExtCtrls;type  TIncodeMes = array of Integer;  TForm16 = class(TForm)    Memo1: TMemo;    Memo2: TMemo;    Button1: TButton;    Memo3: TMemo;    Button2: TButton;    GroupBox1: TGroupBox;    Label1: TLabel;    Edit1: TEdit;    Edit2: TEdit;    Edit3: TEdit;    Label2: TLabel;    Label3: TLabel;    Label4: TLabel;    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);  private    FMes: TIncodeMes;  public    { Public declarations }  end;var  Form16: TForm16;implementationuses math;{$R *.dfm} function Bit(Value, n: Integer): Boolean;asm   bt eax, edx   setc al   and eax, 0FFhend; function FastPower(a, b, n: integer): integer;var i: integer;    ai: extended;begin  ai := a;  for I := Trunc(log2(b)) - 1 downto 0 do  if Bit(b, i) then ai := Round(sqr(ai) * a) mod n else ai := Round(sqr(ai)) mod n;  result := Round(ai);end;function Encrypt(s: string; e, n: integer): TIncodeMes;  var I: Integer;begin  SetLength(result, length(s));  for I := 0 to Length(s) - 1 do    result[i] := FastPower(ord(s[i + 1]), e, n)end;function Decrypt(s: array of integer; e, n: integer): string;  var i: Integer;begin  SetLength(Result, Length(s));  for I := 0 to Length(s) - 1 do    result[i + 1] := chr(FastPower(s[i], e, n))end; procedure TForm16.Button1Click(Sender: TObject);  var i, n, e: Integer;begin  n := StrToIntDef(Edit3.Text, 697);  e := StrToIntDef(Edit2.Text, 7);  FMes := Encrypt(Memo1.Lines.Text, e, n);  for i := 0 to High(FMes) do Memo2.Lines.Append(IntToStr(FMes[i]));end; procedure TForm16.Button2Click(Sender: TObject);  var i, n, d: integer;      s : string;begin  d := StrToIntDef(Edit1.Text, 183);  n := StrToIntDef(Edit3.Text, 697);  s := Decrypt(FMes,d , n);  Memo3.Lines.Add(s)end;end.
|  |   Вопрос задал: Александр7 (статус: Посетитель)Вопрос отправлен: 16 мая 2009, 19:26
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Александр7!Это называется "использование не инициализированных переменных". Смотрим код расшифровки.
 
 procedure TForm1.Button2Click(Sender: TObject);
  var i, n, d: integer;//а i здесь наверно не даром?
      s : string;
begin
  d := StrToIntDef(Edit1.Text, 183);//Ок, первая часть ключа
  n := StrToIntDef(Edit3.Text, 697);//и вторая.
  s := Decrypt(FMes,d , n);//а теперь расшифровываем. Но стоп, а что такое FMes???
  Memo3.Lines.Add(s)//и вывели
end;Начинаем смотреть по коду и видим, что FMes инициализируется только в процедуре шифрования. И когда перезапускаем программу, естественно, что там ничего нет. А раз ничего нет, значит нет чего и расшифровывать. Что же делать? Написать инициализацию. Где то такprocedure TForm1.Button2Click(Sender: TObject);
 var i, n, d: integer;
 s : string;
 begin
 SetLength(FMes, Memo2.lines.count);
 for i := 0 to Memo2.Lines.Count-1 do
 Fmes[i] := StrToInt(Memo2.lines[i]);
 d := StrToIntDef(Edit1.Text, 183);
 n := StrToIntDef(Edit3.Text, 697);
 s := Decrypt(FMes,d , n);
 Memo3.Lines.Add(s)
 end;
 И наверно стоит подумать, нужно ли вообще поле FMes....
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 16 мая 2009, 20:21
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо, без вас бы не разобрался! |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |