0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
1

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

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

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

и выделяется строка "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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2016, 22:47
Ответы с готовыми решениями:

Шифрование текста в RSA
Есть ли какие нибудь статьи для новичков? Исходник есть но в нем я ничего не понял: function...

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

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

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

12
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
12.03.2016, 10:24 2
Цитата Сообщение от 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  [ТС] 3
Цитата Сообщение от FIL Посмотреть сообщение
И зачем такое извращение? Не проще ли ord(Memo3.Text[i]) возвести в степень d?
Нет, не проще. По поводу извращения - не спорю, но у переменной s целочисленный тип. Для функции возведения она должна быть вещественной. Пробовал поначалу без цикла, выдавало ошибку, соответствующую вышесказанному. Кстати, в блоке кода для шифровки текста тоже цикл по Memo, но там ошибка не выскакивает.
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
12.03.2016, 20:54 4
Цитата Сообщение от Slavjanych Посмотреть сообщение
у переменной s целочисленный тип
Можно привести результат возведения в степень к целочисленному типу.

Цитата Сообщение от Slavjanych Посмотреть сообщение
в блоке кода для шифровки текста тоже цикл по Memo
Мемо Мему рознь)
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 00:07  [ТС] 5
Цитата Сообщение от FIL Посмотреть сообщение
Можно привести результат возведения в степень к целочисленному типу.
Как это сделать можно?
0
20 / 10 / 2
Регистрация: 07.03.2016
Сообщений: 211
13.03.2016, 02:35 6
глупый вопрос:
у вас цель - сделать какую то именно криптостойкую штучку,
или учебная, и просто нужно написать и сдать?
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 03:11  [ТС] 7
Цитата Сообщение от jdzvk Посмотреть сообщение
у вас цель - сделать какую то именно криптостойкую штучку,
или учебная, и просто нужно написать и сдать?
Написать программу для курсовой нужно. Главное, чтобы правильно работала, всё правильно считала, правильно шифровала и расшифровывала.
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
13.03.2016, 10:48 8
Цитата Сообщение от Slavjanych Посмотреть сообщение
Как это сделать можно?
Round()
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 21:12  [ТС] 9
Цитата Сообщение от 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
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
13.03.2016, 21:25 10
Цитата Сообщение от Slavjanych Посмотреть сообщение
Появляется ошибка
Ну попробуй скобки правильно расставить.
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 21:45  [ТС] 11
Цитата Сообщение от FIL Посмотреть сообщение
Ну попробуй скобки правильно расставить.
Расставил. Запустилось. В шифровании тоже цикл убрал. Теперь выскакивает ошибка "Floating point overflow".
Миниатюры
Шифрование текста по алгоритму RSA  
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
13.03.2016, 22:01 12
Значит степень слишком большая и результат не помещается в переменную.
0
0 / 0 / 0
Регистрация: 04.06.2014
Сообщений: 28
13.03.2016, 22:56  [ТС] 13
Цитата Сообщение от FIL Посмотреть сообщение
Значит степень слишком большая и результат не помещается в переменную.
Можно этого обойти как-то?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2016, 22:56
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru