|
Вопрос # 2 791/ вопрос открыт / |
|
Здравствуйте, эксперты!
Есть программа шифрования RSA. На форме 3 Memo и кнопки шифровать и дешифровать. В первое Memo вводим текст, нажимаем шифровать, во второе выводится шифр. Нажимаем дешифровать и в третье выводится расшифрованный текст. Но если, к примеру, шифр из второго Memo скопировать, перезапустить программу и вставить обратно, то этот текст уже не расшифровывается. Подскажите, пожалуйста, что нужно изменить в коде
Приложение: Переключить в обычный режим- unit Unit16;
- interface
- uses
- 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;
- implementation
- uses math;
- {$R *.dfm}
-
- function Bit(Value, n: Integer): Boolean;
- asm
- bt eax, edx
- setc al
- and eax, 0FFh
- end;
-
- 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
Комментарий к оценке: Спасибо, без вас бы не разобрался!
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|