Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 791

/ вопрос открыт /

Здравствуйте, эксперты!
Есть программа шифрования RSA. На форме 3 Memo и кнопки шифровать и дешифровать. В первое Memo вводим текст, нажимаем шифровать, во второе выводится шифр. Нажимаем дешифровать и в третье выводится расшифрованный текст. Но если, к примеру, шифр из второго Memo скопировать, перезапустить программу и вставить обратно, то этот текст уже не расшифровывается. Подскажите, пожалуйста, что нужно изменить в коде

Приложение:
  1. unit Unit16;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls, ExtCtrls;
  6. type
  7. TIncodeMes = array of Integer;
  8. TForm16 = class(TForm)
  9. Memo1: TMemo;
  10. Memo2: TMemo;
  11. Button1: TButton;
  12. Memo3: TMemo;
  13. Button2: TButton;
  14. GroupBox1: TGroupBox;
  15. Label1: TLabel;
  16. Edit1: TEdit;
  17. Edit2: TEdit;
  18. Edit3: TEdit;
  19. Label2: TLabel;
  20. Label3: TLabel;
  21. Label4: TLabel;
  22. procedure Button1Click(Sender: TObject);
  23. procedure Button2Click(Sender: TObject);
  24. private
  25. FMes: TIncodeMes;
  26. public
  27. { Public declarations }
  28. end;
  29. var
  30. Form16: TForm16;
  31. implementation
  32. uses math;
  33. {$R *.dfm}
  34.  
  35. function Bit(Value, n: Integer): Boolean;
  36. asm
  37. bt eax, edx
  38. setc al
  39. and eax, 0FFh
  40. end;
  41.  
  42. function FastPower(a, b, n: integer): integer;
  43. var i: integer;
  44. ai: extended;
  45. begin
  46. ai := a;
  47. for I := Trunc(log2(b)) - 1 downto 0 do
  48. if Bit(b, i) then ai := Round(sqr(ai) * a) mod n else ai := Round(sqr(ai)) mod n;
  49. result := Round(ai);
  50. end;
  51. function Encrypt(s: string; e, n: integer): TIncodeMes;
  52. var I: Integer;
  53. begin
  54. SetLength(result, length(s));
  55. for I := 0 to Length(s) - 1 do
  56. result[i] := FastPower(ord(s[i + 1]), e, n)
  57. end;
  58. function Decrypt(s: array of integer; e, n: integer): string;
  59. var i: Integer;
  60. begin
  61. SetLength(Result, Length(s));
  62. for I := 0 to Length(s) - 1 do
  63. result[i + 1] := chr(FastPower(s[i], e, n))
  64. end;
  65.  
  66. procedure TForm16.Button1Click(Sender: TObject);
  67. var i, n, e: Integer;
  68. begin
  69. n := StrToIntDef(Edit3.Text, 697);
  70. e := StrToIntDef(Edit2.Text, 7);
  71. FMes := Encrypt(Memo1.Lines.Text, e, n);
  72. for i := 0 to High(FMes) do Memo2.Lines.Append(IntToStr(FMes[i]));
  73. end;
  74.  
  75. procedure TForm16.Button2Click(Sender: TObject);
  76. var i, n, d: integer;
  77. s : string;
  78. begin
  79. d := StrToIntDef(Edit1.Text, 183);
  80. n := StrToIntDef(Edit3.Text, 697);
  81. s := Decrypt(FMes,d , n);
  82. Memo3.Lines.Add(s)
  83. end;
  84. end.


Александр7 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Александр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

Комментарий к оценке: Спасибо, без вас бы не разобрался!

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 5 апреля 2020, 07:41
Выполнено за 0.02 сек.
Рейтинг@Mail.ru