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

Проблема шифрования способом RSA

13.10.2021, 14:44. Показов 3386. Ответов 28
Метки rsa (Все метки)

Студворк — интернет-сервис помощи студентам
В чем проблемы:
1. При шифровании текста он не правильно выводит значение. Например, буква п, номер 17, открытый ключ {7, 697},{183, 697}, по формуле которая идет для шифрования способом RSA, мы находим что в зашифрованном виде оно должно выглядеть так: i := (17^7) mod 697 = 136, а код при шифровании выдает 538
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
function Bit(Value, n: Integer): Boolean;
begin 
  result := Value and (1 shl n) <> 0;
end; 
 
//Функция возведения в степень для шифрования текста
function Power(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;
 
//Функция шифрования RSA
function Encrypt(s: string; e, n: integer): TIncodeMes;
var
  i: Integer; 
begin 
  SetLength(result, length(s));
  for i := 0 to Length(s) do
    result[i] := Power(ord(s[i + 1]), e, n) 
end;
 
//Функция расшифрования RSA
function Decrypt(s: array of integer; e, n: integer): string; 
var
  i: Integer;
begin 
  SetLength(result, Length(s)); 
  for i := 0 to Length(s) do
    result[i + 1] := chr(Power(s[i], e, n)) 
end; 
 
//Процедура шифрования, RSA
procedure TForm1.EncryptedRSAClick(Sender: TObject);
var
  i, n, e, x1, x2: Integer; 
begin 
  mmo2.Text := ''; //отчистка
  x1 := 0; 
  x2 := 0; 
  n := StrToIntDef(edt1.Text, x1); 
  e := StrToIntDef(edt2.Text, x2); 
  FMes := Encrypt(mmo1.Lines.Text, e, n);
  for i := 0 to High(FMes) do
    mmo2.Lines.Append(IntToStr(FMes[i])); 
end; 
 
//Процедура расшифрования, RSA
procedure TForm1.DecryptedRSAClick(Sender: TObject);
var
  n, d, x1, x3: integer;
  s: string; 
begin 
  mmo3.Text := ''; 
  x1 := 0; 
  x3 := 0;
  n := StrToIntDef(Edt1.Text, x1); 
  d := StrToIntDef(Edt3.Text, x3); 
  s := Decrypt(FMes, d, n);
  mmo3.Lines.Append(s) //Вывод текста
end;
Добавлено через 25 минут
(Есть три поля: 1 поле для исходного текста: п, 2 поле для зашифрованного текста: 536, 3 поле для для расшифрованного текста: п)
В чем проблемы:
1. При шифровании текста он неправильно выводит значение. Например, буква п, номер 17, открытый ключ {7, 697},{183, 697}, по формуле которая идет для шифрования способом RSA, мы находим что в зашифрованном виде оно должно выглядеть так: i := (17^7) mod 697 = 136, а код при шифровании выдает 538, что нужно поменять чтобы он выдавал правильное значение (136)? При этом когда он кодирует через другие значения такие как 538, то он также выдает ответ букву п.
2. При шифровании когда использую другие ключи текст шифруется, но расшифроваться не может. С чем это связано? Может с тем что он неправильно находит значения (первый пункт), я так думаю, но поделать ничего не могу, так как не знаю как исправить это.
3. Как улучшить код?:
1) Мне нужно чтобы моё приложение расшифровывало какой-нибудь зашифрованный текс, но оно не может, т.к. для расшифрования оно использует буфер обмена, куда заносятся буквы при шифровании текста, а так как их там нет, то и расшифровать не получается.
2) Из первого пункта выплывает второй. Если я например зашифрую текст, введя его в поле один и при шифровании он выводится во 2 поле, потом расшифрую (вывод в поле 3), отчищу поля (где заполнялся и выводился текст),возьму зашифрованный текст и вставлю его в поле где он выводится (2 поле), то при нажатии расшифровать, в третьем поле выводится текст (все потому что буквы которые использовались при шифровании, находятся в буфере, и за счет этого происходит расшифрование, причем даже если указана половина зашифрованного текста). Как это исправить?

Помогите пожалуйста!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.10.2021, 14:44
Ответы с готовыми решениями:

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

Алгоритм шифрования RSA
Необходимо реализовать программу, которая по заданному паролю шифрует данные и дешифрует оные вышеуказанным алгоритмом. Вот мой код для...

Алгоритм шифрования RSA
Просьба поделитесь алгоритмом шифрования RSA на PHP

28
0 / 0 / 0
Регистрация: 25.09.2021
Сообщений: 88
17.10.2021, 10:24  [ТС]
Студворк — интернет-сервис помощи студентам
Я эту функцию назвал power1 чтобы она не использовалась, но всё же, я пробывал переписать функцию Decrypt, но не смог. AzAtom, поможете пожалуйста?
0
0 / 0 / 0
Регистрация: 25.09.2021
Сообщений: 88
18.10.2021, 18:13  [ТС]
Помогите пожалуйста написать функцию Decrypt к этой функции:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const abs1: string = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
 
function Encrypt(s: AnsiString ; e, n: integer): TIncodeMes;
var
  i: Integer; //Переменная(ые)
  ex: Extended;
begin //Начало
  SetLength(result, length(s)); //Определение длины открытого массива
  for i := 0 to Length(s)-1 do begin
    //выполнение цикла, пока значение i не станет равным длине слова(ов), текста
    ex := Power(Pos(s[i + 1], abs1), e); //Шифрование текста
    result[i] := Round(ex - Trunc(ex/n)*n); // здесь функция Power из модуля Math
  end;
end; //Конец
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
19.10.2021, 02:31
Цитата Сообщение от 123valik321 Посмотреть сообщение
Помогите пожалуйста написать функцию Decrypt к этой функции:
Вот пусть тот кто вам эту бредовую функцию Encrypt написал, напишет вам функцию Decrypt.
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,347
19.10.2021, 06:04
Лучший ответ Сообщение было отмечено 123valik321 как решение

Решение

Цитата Сообщение от 123valik321 Посмотреть сообщение
Помогите пожалуйста написать функцию Decrypt к этой функции:
Прикол в том, что шифрует и дешифрует одна и та же функция. И у неё на входе и выходе просто массив чисел. Надо немного переделать эти функции. Например, вот так:
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
type
  TIncodeMes = array of Integer;
 
  TForm1 = class(TForm)
...
  private
    FMes: TIncodeMes;
...
implementation
 
//Функция возведения в степень для шифрования текста
 
function PowerMod(a, e, n: integer): integer; //переменная(ые)
var
  i: integer; //переменная(ые)
  ai: extended; //переменная(ые)
begin //начало
  ai := a;
  for i := trunc(log2(e)) - 1 downto 0 do //
    if bit(e, i) then //
      ai := round(sqr(ai) * a) mod n //
    else //
      ai := round(sqr(ai)) mod n; //
  result := round(ai); //
end; //конец
 
//Функция шифрования/расшифровывания RSA
 
function Encrypt2(s: TIncodeMes; e, n: integer): TIncodeMes;
var
  i: Integer; //Переменная(ые)
begin //Начало
  SetLength(Result, length(s)); //Определение длины открытого массива
  for i := 0 to High(s) do
    //выполнение цикла, пока значение i не станет равным длине слова(ов), текста
    Result[i] := PowerMod(s[i], e, n);
end; //Конец
 
 
 
 
//Процедура шифрования, RSA
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i, n, e: Integer; //Переменная(ые)
  s: AnsiString;
  Src: TIncodeMes;
begin //Начало
  Memo2.Text := ''; //отчистка
  n := StrToIntDef(Edit1.Text, 0); //Ввод числа n, модуль
  e := StrToIntDef(Edit2.Text, 0); //Ввод числа e, открытый ключ
  s := Memo1.Text;
 
  SetLength(Src, Length(s));
  For i := 0 to High(Src) do
    Src[i] := Ord(s[i+1]); // Получили код символа
 
  FMes := Encrypt2(Src, e, n); // Шифрование
 
  for i := 0 to High(FMes) do //Выполнение цикла от 0 до максимального значения
    Memo2.Lines.Append(IntToStr(FMes[i])); //Вывод зашифрованного текста
end; //Конец
 
 
procedure TForm1.Button2Click(Sender: TObject);
var
  t: AnsiString ; //Переменная(ые)
  i, n, d: integer; //Переменная(ые)
  Src: TIncodeMes;
begin //Начало
  t := Memo2.Text; //Ввод текста
  n := StrToIntDef(Edit3.Text, 0); //Ввод числа n, модуль
  d := StrToIntDef(Edit4.Text, 0); //Ввод числа d, закрытый ключ
 
  SetLength(Src, Memo2.Lines.Count);
  for i := 0 to Memo2.Lines.Count-1 do
    Src[i] := StrToIntDef(Memo2.Lines[i], 0); // Заполнили массив числами
 
  FMes := Encrypt2(Src, d, n); // Дешифровка
 
  SetLength(t, Length(FMes));
  for i := 0 to High(FMes) do //Выполнение цикла от 0 до максимального значения
    t[i+1] := Chr(FMes[i]);
 
  Memo3.Lines.Text := t; //Вывод расшифрованного текста
end; //Конец
1
0 / 0 / 0
Регистрация: 25.09.2021
Сообщений: 88
19.10.2021, 13:56  [ТС]
Спасибо AzAtom, но интересно получается что в этом случае текст шифруется правильно, но нет функции расшифровки (1):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const abs1: string = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
 
function Encrypt(s: AnsiString ; e, n: integer): TIncodeMes;
var
  i: Integer; //Переменная(ые)
  ex: Extended;
begin //Начало
  SetLength(result, length(s)); //Определение длины открытого массива
  for i := 0 to Length(s)-1 do begin
    //выполнение цикла, пока значение i не станет равным длине слова(ов), текста
    ex := Power(Pos(s[i + 1], abs1), e); //Шифрование текста
    result[i] := Round(ex - Trunc(ex/n)*n); // здесь функция Power из модуля Math
  end;
end; //Конец
а тут всё наоборот, функция расшифрования есть, но она не правильно выводит текст (2):
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
function PowerMod(a, e, n: integer): integer; //переменная(ые)
var
  i: integer; //переменная(ые)
  ai: extended; //переменная(ые)
begin //начало
  ai := a;
  for i := trunc(log2(e)) - 1 downto 0 do //
    if bit(e, i) then //
      ai := round(sqr(ai) * a) mod n //
    else //
      ai := round(sqr(ai)) mod n; //
  result := round(ai); //
end; //конец
 
//Функция шифрования/расшифровывания RSA
function Encrypt2(s: TIncodeMes; e, n: integer): TIncodeMes;
var
  i: Integer; //Переменная(ые)
begin //Начало
  SetLength(Result, length(s)); //Определение длины открытого массива
  for i := 0 to High(s) do
    //выполнение цикла, пока значение i не станет равным длине слова(ов), текста
    Result[i] := PowerMod(s[i], e, n);
end; //Конец
 
//Процедура шифрования, RSA
procedure TForm1.Button1Click(Sender: TObject);
var
  i, n, e: Integer; //Переменная(ые)
  s: AnsiString;
  Src: TIncodeMes;
begin //Начало
  Memo2.Text := ''; //отчистка
  n := StrToIntDef(Edit1.Text, 0); //Ввод числа n, модуль
  e := StrToIntDef(Edit2.Text, 0); //Ввод числа e, открытый ключ
  s := Memo1.Text;
  SetLength(Src, Length(s));
  For i := 0 to High(Src) do
    Src[i] := Ord(s[i+1]); // Получили код символа
  FMes := Encrypt2(Src, e, n); // Шифрование
  for i := 0 to High(FMes) do //Выполнение цикла от 0 до максимального значения
    Memo2.Lines.Append(IntToStr(FMes[i])); //Вывод зашифрованного текста
end; //Конец
 
procedure TForm1.Button2Click(Sender: TObject);
var
  t: AnsiString ; //Переменная(ые)
  i, n, d: integer; //Переменная(ые)
  Src: TIncodeMes;
begin //Начало
  t := Memo2.Text; //Ввод текста
  n := StrToIntDef(Edit3.Text, 0); //Ввод числа n, модуль
  d := StrToIntDef(Edit4.Text, 0); //Ввод числа d, закрытый ключ
  SetLength(Src, Memo2.Lines.Count);
  for i := 0 to Memo2.Lines.Count-1 do
    Src[i] := StrToIntDef(Memo2.Lines[i], 0); // Заполнили массив числами
  FMes := Encrypt2(Src, d, n); // Дешифровка
  SetLength(t, Length(FMes));
  for i := 0 to High(FMes) do //Выполнение цикла от 0 до максимального значения
    t[i+1] := Chr(FMes[i]);
  Memo3.Lines.Text := t; //Вывод расшифрованного текста
end; //Конец
Я конечно многое прошу, но я тупой, как теперь это всё объединить?
Чтобы текст шифровался или декодировался, и чтобы при шифровании выводился правильный текст.
В коде (1), алгоритм работает почти также как и мой первый, шифрует и декодирует, но значения выводит не правильно, но, в алгоритме (2) есть решение на мой вопрос:
3. Как улучшить код?:
1) Мне нужно чтобы моё приложение расшифровывало какой-нибудь зашифрованный текс, но оно не может, т.к. для расшифрования оно использует буфер обмена, куда заносятся буквы при шифровании текста, а так как их там нет, то и расшифровать не получается.
2) Из первого пункта выплывает второй. Если я например зашифрую текст, введя его в поле один и при шифровании он выводится во 2 поле, потом расшифрую (вывод в поле 3), отчищу поля (где заполнялся и выводился текст),возьму зашифрованный текст и вставлю его в поле где он выводится (2 поле), то при нажатии расшифровать, в третьем поле выводится текст (все потому что буквы которые использовались при шифровании, находятся в буфере, и за счет этого происходит расшифрование, причем даже если указана половина зашифрованного текста). Как это исправить?
Это наверное можно было и в один пункт объединить, но да, не заостряйте на этом внимание
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,347
19.10.2021, 15:02
Цитата Сообщение от 123valik321 Посмотреть сообщение
но значения выводит не правильно
Почему это неправильно? Всё правильно. Просто выводит не то, что вы ожидали.

Ни функции шифровки, ни компьютер в целом не работают с символами. Они работают исключительно с числами, а символы уже кодируются определёнными числами. Вы хотите, чтобы у буквы "п" был код 17. Но в вашем же приведённом коде есть алфавит, в котором символу "п" соответствует код 50. А код 17 соответствует символу "П". Так же, в вашем алфавите нет пробела и остальных символов, что не годится для практического применения. Вы можете добавить использование этого алфавита и преобразовывать из стандартной таблицы в свою и обратно. Но есть ли в этом смысл?
1
0 / 0 / 0
Регистрация: 25.09.2021
Сообщений: 88
19.10.2021, 15:48  [ТС]
Блины оладушки, ну почему, ну за что, там же таблица ascii применятся, я это знал, но не сложил 2 + 2, ааа
Хорошо, осталась одна проблема, называется: почему некоторые ключи не работают?
К примеру: бывает ключ который расшифровывает текст на английском (зашифровали слово и декодируем), но не может расшифровать на русском (шифрует слово, но декодировать уже не может), это получается что это связанно с таблицей ascii?
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,347
19.10.2021, 15:56
это получается что это связанно с таблицей ascii?
Возможно, исходное сообщение было в другой кодировке, нежели вы пытаетесь интерпретировать. Это надо смотреть конкретный пример.
1
0 / 0 / 0
Регистрация: 25.09.2021
Сообщений: 88
19.10.2021, 16:07  [ТС]
Как я понимаю таблица кодировки видет везде ascii, но при шифровании и декодировании возникают проблемы, я попробую сейчас найти эти ключи и скинуть для примера

Добавлено через 3 минуты
ааа, я опять глупость сказал, такая ошибка была у меня в старом коде, прошу прощение.
Большое вам спасибо AzAtom, благодарю за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.10.2021, 16:07
Помогаю со студенческими работами здесь

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

Реализация RSA шифрования
Саму реализацию взяла с MSDNusing System; using System.Security.Cryptography; using System.Text; class RSACSPSample { ...

Принцип RSA шифрования
Начала разбираться с RSA. Не понимаю, почему при шифровании сообщения его необходимо разбивать на блоки,длиной log2(n)+1? То есть...

Алгоритм шифрования RSA
х*17(mod 84)=1 найти х Написать на с++

Алгоритм шифрования RSA
Здравствуйте. Может кто помочь с написанием кода для шифрования RSA? На словах суть данного шифрования понятна, но вот когда начинаешь...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru