Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
takefakecake
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 3
1

Алгоритм RSA. Если открытый текст больше 20 символов, то текст не расшифровывается

13.01.2014, 21:43. Просмотров 873. Ответов 4
Метки нет (Все метки)

Есть реализованный алгоритм RSA на Delphi. Все работает нормально. Но только если открытый текст больше 20 символов, то текст не расшифровывается. Помогите, как исправить?
0
Вложения
Тип файла: rar RSA.rar (224.8 Кб, 39 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2014, 21:43
Ответы с готовыми решениями:

Нужно ввести текст, если он больше 80 символов нужно чтоб он переходил на новую строку
Написал клиент сервер, с командами add-запись в файл, remove-удаление из файла ,display-вывод на...

Алгоритм RSA. Зашифровать введенное с клавиатуры сообщение, используя открытый ключ
Доброе время суток, форумчане! Прощу помощи!!! Дело жизни и смерти! На днях выдали...

Разбить текст на предложение не больше 40 символов
Задано непустой текст.В этом тексте каждое предложение которое больше за 40 символов,разбить на...

дан текст,определить каких символов в тексте больше
дан текст,определить каких символов в тексте больше точек или запетых.

Звуковое оповещение, если в texbox стало больше знаков(текст и т. д.)
У меня в программе задействована новостная лента для моих инвест-пользователей, я там расписываю...

4
Одиночка
3937 / 1862 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
15.01.2014, 20:00 2
Немного правил исходный код, но в результате выяснил, что влияет перенос текста в richEdit и обратно. Т.е. если после шифровки и перед расшифровкой из переменной текст не менять - всё нормально расшифровывается. При переносе в richEdit а потом в переменную txt - расшифровка не получается. Видимо richEdit вносит в текст какие-то изменения, встречая коды, не соответствующие символам.
Поменял richEdit на Memo и всё встало на свои места.

На всякий случай с моими правками:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, FGInt, FGIntRSA, FGIntPrimeGeneration, ComCtrls;
 
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Button1: TButton;
    Label13: TLabel;
    GroupBox2: TGroupBox;
    Label14: TLabel;
    Button2: TButton;
    GroupBox3: TGroupBox;
    Label15: TLabel;
    Label16: TLabel;
    Button3: TButton;
    Label17: TLabel;
    Button4: TButton;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    GroupBox4: TGroupBox;
    Label21: TLabel;
    Label22: TLabel;
    Button5: TButton;
    Label23: TLabel;
    GroupBox5: TGroupBox;
    Label24: TLabel;
    Label25: TLabel;
    Button8: TButton;
    Label3: TLabel;
    RichEdit1: TMemo;
    RichEdit2: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Button6: TButton;
    GroupBox6: TGroupBox;
    Label6: TLabel;
    RichEdit3: TMemo;
    Label26: TLabel;
    RichEdit4: TMemo;
    Label27: TLabel;
    Edit3: TEdit;
    Label28: TLabel;
    Edit4: TEdit;
    Button7: TButton;
    Button9: TButton;
    GroupBox7: TGroupBox;
    Button10: TButton;
    Button11: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1; p,q,fn,i:longint;  e,d,n,nilgint,nilgint1,nilgint2,nilgint3,dp,dq,ap,aq:TFGInt;   txt:string;
  crypt:array[1..10000] of integer;
 
implementation
 
{$R *.dfm}
 
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;
  end;
  Result:=true;
end;
 
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;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Randomize;
  p:=0; q:=0;
  p:=Random(600)+1;
  q:=Random(600)+1;
  Label9.Caption:=IntToStr(p);
  Label10.Caption:=IntToStr(q);
  While not p_number(p) do
  dec(p);
  While not p_number(q) do
  dec(q);
 
  Label11.Caption:=IntToStr(p); //281
  Label12.Caption:=IntToStr(q); //83
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Label14.Caption:=IntToStr(abs(p*q));
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  Label16.Caption:=IntToStr((p-1)*(q-1));
end;
 
procedure TForm1.Button4Click(Sender: TObject);
Var
  i : Integer;
begin
  fn:=StrToInt(Label16.Caption);
  for i:=2 to fn-1 do
  if HOD(fn,i)=1 then
  begin
    Label18.Caption:=IntToStr(i);
    break;
  end;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
Var
  i,e : Integer;
begin
  p:=StrToInt(Label11.Caption);
  q:=StrToInt(Label12.Caption);
  e:=StrToInt(Label18.Caption);
  for i:=1 to StrToInt(Label14.Caption) do
  if ((i*e) mod ((p-1)*(q-1)))=1 then
  begin
    Label22.Caption:=IntToStr(i);
    break;
  end;
end;
 
procedure TForm1.Button8Click(Sender: TObject);
begin
  Base10StringToFGInt(Edit1.Text,e);
  Base10StringToFGInt(Edit2.Text,n);
  txt:=RichEdit1.Lines.Text;
  RSAEncrypt(txt,e,n,txt);
  RichEdit2.Lines.Text:=txt;
end;
 
procedure TForm1.Button6Click(Sender: TObject);
begin
  Edit1.Text:=Label18.Caption;
  Edit2.Text:=Label14.Caption;
end;
 
procedure TForm1.Button7Click(Sender: TObject);
begin
  Edit3.Text:=Label22.Caption;
  Edit4.Text:=Label14.Caption;
end;
 
procedure TForm1.Button9Click(Sender: TObject);
begin
  Base10StringToFGInt(Edit3.Text,d);
  Base10StringToFGInt(Edit4.Text,n);
  txt:=richEdit3.Lines.Text;
  RSADecrypt(txt, d, n, Nilgint, Nilgint, Nilgint, Nilgint, txt);
  RichEdit4.Lines.Text:=txt;
end;
 
procedure TForm1.Button10Click(Sender: TObject);
begin
  Button1.Click;
  Button2.Click;
  Button3.Click;
  Button4.Click;
  Button5.Click;
end;
 
procedure TForm1.Button11Click(Sender: TObject);
begin
  RichEdit3.Lines.Text:=RichEdit2.Lines.Text;
end;
 
end.

Как минимум при переносе в txt нужно писать:
Delphi
1
  txt:=richEdit3.Lines.Text;
Оставил имена, чтобы не править весь текст.

Чтобы легче менять. Сделал View As Text формы и заменил TRichEdit на TMemo и потом в коде тоже.

Добавлено через 11 часов 13 минут
Думал, что помогло. Оказалось не всегда. Попробовал при записи зашифрованного текста сразу записывать и в буфер обмена (прямо из переменной).
Delphi
1
  Clipboard.AsText:=Txt;
А потом читать из буфера обмена и расшифровывать. Не из Memo. Т.е. Когда нажимаешь копировать - записывать в Memo из буфера обмена и сразу же из буфера в переменную.
Delphi
1
  Txt:=Clipboard.AsText;
Вроде помогло. Нет времени проверять. Пробуй.
Модуль ClipBrd - ссылку в описание Uses.

Добавлено через 19 минут
Проверил. Не помогло. Видимо попадает такой код, который никак для текстовой информации не подходит. Нужно сохранять как двоичные данные.
1
takefakecake
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 3
15.01.2014, 22:49  [ТС] 3
Благодарю вас. Буду переписывать.
0
Одиночка
3937 / 1862 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
16.01.2014, 00:17 4
Ты подожди переписывать. Тут есть аналогичная тема. И там та же проблема. Причём просто замена на Memo и копирование в буфер обмена как текст - не помогло. Поэтому я ещё буду разбираться, чтобы передавать как двоичные данные. Как-то так.

Добавлено через 1 час 26 минут
Короче, суть такая. Обычные String имеют в начале кличество символов строки. Поэтому не важно какие символы (коды) в строке присутствуют. А вот при работе через буфер обмена и, видимо, при записи/чтении из Memo строки используют формат PChar. Код 0 - является признаком конца строки. Поэтому закодированный текст обрезается.
Самый простой вариант в твоём случае - после кодирования декодирование текста делать из той же переменной - в которой остался закодированный текст (Txt). Не читая в неё из Memo. Т.е. советую просто закомментировать строку:
Delphi
1
  txt:=richEdit3.Lines.Text;
1
takefakecake
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 3
16.01.2014, 01:08  [ТС] 5
Хорошо, безмерно благодарен вам.
0
16.01.2014, 01:08
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2014, 01:08

как задать текст длинной не больше 100 символов заканчивающийся точкой?
код пожалуйста))

Текст занимает 0,25 Кбайт памяти компьютера. Сколько символов содержит этот текст?
Текст занимает 0,25 Кбайт памяти компьютера. Сколько символов содержит этот текст?

Определить открытый текст
Дан шифротекст АРБРЖКФЖМХСРЗЗРЛЖЗВАСНЭОЙ. Ключ - ЗИМА. Алгоритм шифрования - таблица Виженера.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.