Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28

Шифрование текста по алгоритму RSA

11.03.2016, 22:47. Показов 4440. Ответов 12

Студворк — интернет-сервис помощи студентам
Добрый вечер. Для курсовой работы нужно написать программу на делфи, шифрующую текст с помощью алгоритма RSA. Принцип работы моего варианта следующий. Случайным образом генерируются простые числа p и q, расчитываются открытый и закрытый ключи. Затем каждый символ исходного сообщения преобразовывается в соответствующий ему ASCII код, который шифруется открытым ключом и полученный код преобразуется в символ. Есть 2 проблемы:
1) Программа неправильно шифрует текст. Например, слово "Привет" с открытым ключом (21013,55493) она шифрует, как "Џч" (без кавычек).
2) При попытке расшифровки выскакивает ошибка:

и выделяется строка "s:=s*ord(Memo3.Text[i]);".
Где тут могут быть проблемы?
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Label3: TLabel;
    Edit2: TEdit;
    Label4: TLabel;
    Edit3: TEdit;
    Label5: TLabel;
    Edit4: TEdit;
    Label6: TLabel;
    Edit5: TEdit;
    Label7: TLabel;
    Edit6: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Memo2: TMemo;
    Button5: TButton;
    Label8: TLabel;
    Memo3: TMemo;
    Label9: TLabel;
    Memo4: TMemo;
    Button6: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var p,q,s,n,eil,e,i,d:integer;
    alf,slovo,anslovo:string;
label m1,m2,m3;
begin
  Memo1.Lines.Clear;
  p:=0; q:=0;
  while p=q do
 
 //Генератор простых чисел p и q
  begin
m1: randomize;
    p:=RandomRange(100,900);
    for i:=2 to p-1 do
      begin
        s:=p mod i;
        if s=0 then goto m1;
      end;
    Edit1.Text:=FloatToStr(p);
 
m2: randomize;
    q:=RandomRange(100,900);
    for i:=2 to q-1 do
      begin
        s:=q mod i;
        if s=0 then goto m2;
      end;
    Edit2.Text:=FloatToStr(q);
  end;
 
 //Расчёт значений n и ф(n)
  n:=p*q;
  eil:=(p-1)*(q-1);
  Edit3.Text:=FloatToStr(n);
  Edit4.Text:=FloatToStr(eil);
 
 //Поиск открытой экспоненты e
m3: randomize;
    e:=RandomRange(2,eil);
    for i:=2 to e do
      if (e mod i = 0) and (eil mod i = 0) then goto m3;
    Edit5.Text:=FloatToStr(e);
 
 //Расчёт секретной экспоненты d
  for i:=1 to n do
    if e*i mod eil = 1 then
      break;
  d:=i;
  Edit6.Text:=FloatToStr(d);
 
  Memo1.Lines.Add('Открытый ключ: ('+Edit5.Text+','+Edit3.Text+')');
  Memo1.Lines.Add('Закрытый ключ: ('+Edit6.Text+','+Edit3.Text+')');
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
      Memo2.Lines.LoadFromFile(OpenDialog1.FileName);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  if SaveDialog1.Execute then
      Memo4.Lines.LoadFromFile(SaveDialog1.FileName);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  Memo4.Lines.SaveToFile(OpenDialog1.FileName);
end;
 
 //Шифрование
procedure TForm1.Button5Click(Sender: TObject);
var k,s,e,n:int64;
    i:cardinal;
begin
  e:=StrToInt(Edit5.Text);
  n:=StrToInt(Edit3.Text);
  for i:=1 to length(Memo2.Text) do
    begin
      k:=1; s:=1;
      while k<=e do
        begin
          s:=s*ord(Memo2.Text[i]);
          k:=k+1;
        end;
      Memo3.Text:=Memo3.Text+chr(s mod n);
    end;
end;
 
 //Расшифровка текста
procedure TForm1.Button6Click(Sender: TObject);
var k,s,d,n:int64;
    i:cardinal;
begin
  d:=StrToInt(Edit6.Text);
  n:=StrToInt(Edit3.Text);
  for i:=1 to length(Memo2.Text) do
    begin
      k:=1; s:=1;
      while k<=d do
        begin
          s:=s*ord(Memo3.Text[i]);
          k:=k+1;
        end;
      Memo3.Text:=Memo4.Text+chr(s mod n);
    end;
end;
 
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.03.2016, 22:47
Ответы с готовыми решениями:

Шифрование текста в RSA
Есть ли какие нибудь статьи для новичков? Исходник есть но в нем я ничего не понял: function Bit(Value, n: Integer): Boolean; asm ...

Составить программу, реализующую функции шифрования и расшифровывания текста по алгоритму шифрования RSA
1. Составить модуль программы вычисления простых чисел и вычислить сто простых чисел. 2. Выбрать из полученного списка простых чисел два...

RSA шифрование
Привет Программерам, у меня вопрос есть программа которая шифрует и дешифрует методом РСА , но дело в том что делает это она пока не...

12
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
12.03.2016, 10:24
Цитата Сообщение от Slavjanych Посмотреть сообщение
выделяется строка "s:=s*ord(Memo3.Text[i]);"
Там цикл у тебя по Memo2.
И зачем такое извращение? Не проще ли ord(Memo3.Text[i]) возвести в степень d?
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
12.03.2016, 16:54  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
И зачем такое извращение? Не проще ли ord(Memo3.Text[i]) возвести в степень d?
Нет, не проще. По поводу извращения - не спорю, но у переменной s целочисленный тип. Для функции возведения она должна быть вещественной. Пробовал поначалу без цикла, выдавало ошибку, соответствующую вышесказанному. Кстати, в блоке кода для шифровки текста тоже цикл по Memo, но там ошибка не выскакивает.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
12.03.2016, 20:54
Цитата Сообщение от Slavjanych Посмотреть сообщение
у переменной s целочисленный тип
Можно привести результат возведения в степень к целочисленному типу.

Цитата Сообщение от Slavjanych Посмотреть сообщение
в блоке кода для шифровки текста тоже цикл по Memo
Мемо Мему рознь)
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 00:07  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Можно привести результат возведения в степень к целочисленному типу.
Как это сделать можно?
0
20 / 10 / 2
Регистрация: 07.03.2016
Сообщений: 211
13.03.2016, 02:35
глупый вопрос:
у вас цель - сделать какую то именно криптостойкую штучку,
или учебная, и просто нужно написать и сдать?
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 03:11  [ТС]
Цитата Сообщение от jdzvk Посмотреть сообщение
у вас цель - сделать какую то именно криптостойкую штучку,
или учебная, и просто нужно написать и сдать?
Написать программу для курсовой нужно. Главное, чтобы правильно работала, всё правильно считала, правильно шифровала и расшифровывала.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
13.03.2016, 10:48
Цитата Сообщение от Slavjanych Посмотреть сообщение
Как это сделать можно?
Round()
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 21:12  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Round()
Написал так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var k,n:int64;
    d,s:real;
    i:cardinal;
begin
  d:=StrToFloat(Edit6.Text);
  n:=StrToInt(Edit3.Text);
  for i:=1 to length(Memo2.Text) do
    begin
      while k<=d do
        begin
          s:=round(power(ord(Memo3.Text[i])),d);
          Memo4.Text:=Memo4.Text+chr(s mod n);
    end;
end;
Появляется ошибка "[Error] Unit1.pas(160): Not enough actual parameters" в строке "s:=round(power(ord(Memo3.Text[i])),d);"
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
13.03.2016, 21:25
Цитата Сообщение от Slavjanych Посмотреть сообщение
Появляется ошибка
Ну попробуй скобки правильно расставить.
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 21:45  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Ну попробуй скобки правильно расставить.
Расставил. Запустилось. В шифровании тоже цикл убрал. Теперь выскакивает ошибка "Floating point overflow".
Миниатюры
Шифрование текста по алгоритму RSA  
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
13.03.2016, 22:01
Значит степень слишком большая и результат не помещается в переменную.
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 22:56  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Значит степень слишком большая и результат не помещается в переменную.
Можно этого обойти как-то?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.03.2016, 22:56
Помогаю со студенческими работами здесь

Шифрование RSA
Имеется 1 публичный ключ и текст. Нужно зашифровать текст по методу RSA Добавлено через 20 минут Пользовался RSACALC, но в потоке её...

rsa шифрование
нашел исходники- http://plagiata.net.ru/?p=140 но не разберусь. как присваивать свои ключи?

Шифрование алгоритмом RSA
Задается исходная строка и надо зашифровать её по алгоритму RSA Для работы с большими числами скачал библиотеку FGInt (...

Шифрование текста алгоритмом RSA
Всем привет. Помогите пожауйста с реализацией шифрования в Delphi, с использванием алгоритма RSA Что вообще нужно для этого? Я...

RSA шифрование
Пытаюсь авторизоваться в стиме, получаю модуль и экспоненту : модуль:...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru