Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/27: Рейтинг темы: голосов - 27, средняя оценка - 4.96
65 / 65 / 16
Регистрация: 25.11.2009
Сообщений: 283
1

Алгоритм кодирования RSA

04.01.2010, 23:56. Показов 5224. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сам процесс поиска ключей в кодировании сделал, но смущает другое - какой тип данных использовать, как кодировать само сообщение? какой надо тип использовать?
pbyte? - тогда как? заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2010, 23:56
Ответы с готовыми решениями:

Алгоритм цифровой подписи RSA
кто что может подсказать,рассказать... помочь..

Криптоанализ RSA (безключевое чтение). Ускорить алгоритм
Всем привет! Ломаю голову над такой задачей, как ускорить текущий алгоритм? Работает вот так, если...

Алгоритм кодирования SHA-1
Кто работал с алгоритмом кодировки Sha-1 и имеет какие-то исходники?

Алгоритм кодирования последовательности
Здравствуйте, есть ли такой алгоритм кодирования последовательности a_1, a_2, a_3, ..., a_n (a_i ...

16
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
05.01.2010, 09:18 2
Не понятно, что вы пытаетесь сделать...

Объясните толком, что? Как? Зачем? Почему?

И только потом на форуме вам помогут...
0
65 / 65 / 16
Регистрация: 25.11.2009
Сообщений: 283
05.01.2010, 21:12  [ТС] 3
В общем так - Кто знает алгоритм кодирования RSA?
я уже все сделал - алгоритм для нахождения всех переменных есть. Необходима сама процедура возведения отрезка сообщения в степень. с помощью какого типа данных производить???? или необходимо использовать длинную арифметику?? тогда как вводить??
0
19 / 19 / 3
Регистрация: 09.06.2009
Сообщений: 95
17.01.2010, 18:37 4
Вот я тут кое что наклепал, кое что здесь взял. В общем RSA.
Только есть трабл: при попытке дешифровки вылетает ошибка "флоатинг поинт".
То есть получается огромное число при попытке возвести в степень.
Что нужно здесь сделать я ума не приложу. Поэтому интересно услышать мнение ведающих ))

Внизу весь проект, а здесь кнопка дешифровки:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button3Click(Sender: TObject);
var
  x:string;
  w:int64;
  k:longint;
  ww:char;
begin
  form1.Memo4.Clear;
  form1.memo3.Lines.LoadFromFile('c:\\code_file.txt');
 
  for k:=0 to memo3.Lines.Count-1 do
    begin
      x:=memo3.Lines.Strings[k];
      w:=trunc(exp(strtofloat(s6)*ln(strtofloat(x)))) mod trunc(strtofloat(s5));
      ww:=Chr(w);
      form1.Memo4.Lines.Add(ww);
    end;
end;
s6 - скрытый ключ (d)
s5 - произведение чисел p и q (т.е. n)
Вложения
Тип файла: rar rsa.rar (196.2 Кб, 193 просмотров)
1
508 / 227 / 42
Регистрация: 14.11.2009
Сообщений: 371
17.01.2010, 21:30 5
По идее, эта ошибка вылезает, когда пытаешься вместо действительного числа (real, double, Extended) использовать какое-нибудь другое... Но не уверен
0
19 / 19 / 3
Регистрация: 09.06.2009
Сообщений: 95
18.01.2010, 13:01 6
Цитата Сообщение от Ztrel Посмотреть сообщение
По идее, эта ошибка вылезает, когда пытаешься вместо действительного числа (real, double, Extended) использовать какое-нибудь другое... Но не уверен
Может быть, но в данном случаи не так

Пример вживую:

p и q - произвольные простые(!) числа (числа, которые делятся сами на себя и на 1);
n - произведение чисел p и q (n=p*q);
функция эллера f(n)=(p-1)*(q-1);
e и d - открытый и закрытый ключи соответственно;
число e должно удовлетворять 2-ум требованиям
a)e,f(n)=1 -т.е. e и f(n) должны быть взаимопростыми;
b)1<=e<=f(n)
число d определяют таким образом, чтобы выполнялось условие e*d mod f(n) = 1

Итак, принимаем в качестве откр ключа пару (e,n), в качестве закрытого (d,n)
p=7; q=19; e=5; d=65; n=133;
Открытый текст: RSA
Зашифрованный: 24 125 88
Ascii код символов: R=82; S=83; A=65.
Проверяем шифрование:Ci=Mi^e mod n
82^5 mod 133 = 24
Дешифровка:Mi=Ci^d mod n
24^65 mod 133 = 82

Ну вот, смотрите: при возведении в степень 65 получается громаднейшее число (24^65=5,17285984011055E+89)!! Как им оперировать???

Добавлено через 3 часа 36 минут
тип int64 имеет диапазон 9,22E+18
у нас число выходит 5,17E+89 ))))

Добавлено через 10 часов 38 минут
Люди, может там вообще организация е и d не правильна?
0
5 / 5 / 0
Регистрация: 14.09.2009
Сообщений: 80
18.01.2010, 14:02 7
у меня есть сама программа РСА, сам писал когда-то! нада, отпишись тут, вечером залить могу! ТАм не сложно, разберёшься!=)
0
19 / 19 / 3
Регистрация: 09.06.2009
Сообщений: 95
19.01.2010, 04:55 8
Цитата Сообщение от taxo Посмотреть сообщение
у меня есть сама программа РСА, сам писал когда-то! нада, отпишись тут, вечером залить могу! ТАм не сложно, разберёшься!=)
Да, конечно заливай =) буду премного благодарен.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.01.2010, 06:43 9
Не типизированный файл + pbyte/pword/pdword в версии для оперативки.
0
19 / 19 / 3
Регистрация: 09.06.2009
Сообщений: 95
20.01.2010, 12:53 10
Цитата Сообщение от taras atavin Посмотреть сообщение
Не типизированный файл + pbyte/pword/pdword в версии для оперативки.
А можно о подробней? Чтот я не совсем догнал с чем его

Добавлено через 2 часа 38 минут
Может кто знает какие модули, библиотеки подключать? Как вообще управлять большими числами.

Добавлено через 11 часов 26 минут
ё-ё-ё, програмисты! Неужели умеем только матрицы сортировать?!
0
1 / 1 / 0
Регистрация: 20.01.2010
Сообщений: 5
20.01.2010, 16:16 11
Зачем писать то, что уже написано?
Я к примеру, в универе на защите информации успешно использовал открытую библиотеку криптографии DCPcrypt. Если важен результат, а не сама суть написания алгоритма, это вам поможет.
1
24 / 22 / 2
Регистрация: 15.01.2010
Сообщений: 43
20.01.2010, 19:40 12
была у нас такая задача по работе с числами больше разрядной сетки, лаба по системному программированию, но к сожалению все, что я помню - использовали типы лонглдабл (С++), раздельно хранили мантису и степень,те ручками эмулировали работу АЛУ. Но за то время, что уже прошло программировать стало намного удобнее и проще, так что остается "юзать" поиск и описания на функции и процедуры.
1
5 / 5 / 0
Регистрация: 14.09.2009
Сообщений: 80
22.01.2010, 01:56 13
кароч вот те..там поразбирайся сам!! на бумаге лучше всего шрифты разбираются=)!
Вложения
Тип файла: rar RSA.rar (242.5 Кб, 273 просмотров)
1
65 / 65 / 16
Регистрация: 25.11.2009
Сообщений: 283
22.01.2010, 19:24  [ТС] 14
большое спасибо BunnyBoy, EJIF!!
0
19 / 19 / 3
Регистрация: 09.06.2009
Сообщений: 95
24.01.2010, 16:11 15
Цитата Сообщение от taxo Посмотреть сообщение
кароч вот те..там поразбирайся сам!! на бумаге лучше всего шрифты разбираются=)!
Спасибо, но она чтот не работает.


Я алгоритм шифровки и дешифровки уже написал. Помогите разобраться в чем бок.
Все считает, но неправильно. Вот алгоритм:
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
...
const
 pk=5; //e
 sk=317; //d
 n1=437; //n
...
//Шифровка
procedure TForm1.Button2Click(Sender: TObject);
var
x:string;
k,q:longint;
w:int64;
 
begin
form1.Memo2.Clear;
 for k:=0 to memo1.Lines.Count do
  begin
   x:=memo1.Lines.Strings[k];
    for q:=1 to length(x) do
      begin
       w:=trunc(exp(pk*ln(strtoint(inttostr(ord(x[q])))))) mod n1;
       memo5.Text:=memo5.Text+inttostr(ord(x[q]))+',';
       form1.Memo2.Lines.Add(inttostr(w));
      end;
  end;
end;
 
//Дешифровка
procedure TForm1.Button3Click(Sender: TObject);
var
x:string;
m1,m2,w:longint;
k,j:longint;
ww:char;
 
begin
 form1.Memo4.Clear;
 form1.memo3.Text:=form1.Memo2.Text;
 
  for k:=0 to memo3.Lines.Count-1 do
   begin
     m1:=1;
     x:=memo3.Lines.Strings[k];
      m2:=strtoint(x);
     for j:=2 to sk do
       begin
        m1:=m1*m2;
        m1:=m1 mod n1;
       end;
     //w:=m2 mod n1;
     memo6.Text:=memo6.Text+inttostr(m1)+',';
     w:=m1;
     ww:=Chr(w);
     form1.Memo4.Lines.Add(ww);
   end;
end;
Добавлено через 3 минуты
Не правильно считает при дешифровки:
Например символ R=82
Шифруем: R=119
Дешифруем: в идеале должно быть 82. У меня R=423
0
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 1
17.06.2018, 11:47 16
у тебя есть ли эта программа в данный момент?
0
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 4
11.11.2018, 15:46 17
Генерирую и экспортирую в файлы приватный и публичный ключи

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
var
pbuf:tstringstream;
buflen:dword;
pass:ansistring;
begin
CryptAcquireContext( @RSA, PWideChar('my_container'), nil, PROV_RSA_FULL, 0 );
CryptGenKey(RSA, AT_KEYEXCHANGE, (1024 shl 16) or CRYPT_EXPORTABLE, @ExchangeKey);
//
pass := 'password';
CryptCreateHash(RSA, CALG_SHA, 0, 0, RSA_Hash);
  try
  CryptHashData(RSA_Hash, PByte(pass), Length(pass), 0);
  CryptSignHash(RSA_Hash, AT_KEYEXCHANGE, nil,0,nil,@buflen);
  finally
  CryptDestroyHash(RSA_Hash);
  end;
//
pbuf := tstringstream.Create;
CryptExportKey(ExchangeKey, 0, PUBLICKEYBLOB, 0, nil, @buflen);
pbuf.SetSize(buflen);
CryptExportKey(ExchangeKey, 0, PUBLICKEYBLOB, 0, PByte(pbuf.Memory), @buflen);
pbuf.Seek(0, soBeginning);
pbuf.SaveToFile('public.key');
pbuf.Free;
 
pbuf := tstringstream.Create;
CryptExportKey(ExchangeKey, 0, PRIVATEKEYBLOB, 0, nil, @buflen);
pbuf.SetSize(buflen);
CryptExportKey(ExchangeKey, 0, PRIVATEKEYBLOB, 0, PByte(pbuf.Memory), @buflen);
pbuf.Seek(0, soBeginning);
pbuf.SaveToFile('private.key');
pbuf.Free;
//
CryptDestroyKey(ExchangeKey);
CryptReleaseContext( RSA, 0 );
end;
 
Далее импортирую приватный ключ (публичный внутри него)
 
var
pbuf:tstringstream;
i,buflen:dword;
begin
if not FileExists(APP_PATH + 'private.key') then Exit;
CryptAcquireContext( @RSA, PWideChar('my_container'), nil, PROV_RSA_FULL, 0 );
pbuf := tstringstream.Create;
pbuf.LoadFromFile('private.key');
buflen := pbuf.Size;
if CryptImportKey(RSA,PByte(pbuf.Memory),buflen,0,0,@ExchangeKey) then
  begin
  pbuf.Free;
  pbuf := tstringstream.Create;
  CryptExportKey(ExchangeKey, 0, PUBLICKEYBLOB, 0, nil, @buflen);
  pbuf.SetSize(buflen);
  CryptExportKey(ExchangeKey, 0, PUBLICKEYBLOB, 0, PByte(pbuf.Memory), @buflen);
  pbuf.Free;
  pbuf := tstringstream.Create;
  CryptExportKey(ExchangeKey, 0, PRIVATEKEYBLOB, 0, nil, @buflen);
  pbuf.SetSize(buflen);
  CryptExportKey(ExchangeKey, 0, PRIVATEKEYBLOB, 0, PByte(pbuf.Memory), @buflen);
  pbuf.Seek(0, soBeginning);
  pbuf.Free;
  CryptDestroyKey(ExchangeKey);
  CryptReleaseContext( RSA, 0 );
  end;
end;
При генерации я вижу:

публичный ключ:
0602000000A40000525341310004000001000100...

приватный ключ:
0702000000A40000525341320004000001000100...

При импорте только приватного ключа (публичный внутри него) я вижу:

публичный ключ:
0602000000A40000525341310004000001000100...

приватный ключ:
0702000000000000000000000000000000000000...

Подскажите, где и что не так делаю? Почему импорт приватного ключа работает (судя по ипортированному публичному) но сам приватный обнулён?
0
11.11.2018, 15:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2018, 15:46
Помогаю со студенческими работами здесь

Алгоритм кодирования LZ77
привет мальчики помогите пожалуйста мне дописать 3 строчки в функции def makeLZ77. препод сказал...

Алгоритм кодирования RLE
Какова длина последовательности, после кодирования которой методом RLE получится следующее?...

Алгоритм кодирования имен цифрами
Решил написать код для задачки из 3 класса на решение алгоритма. Но запутался в конце кода с 0 ....

Алгоритм оптимального кодирования Хаффмена
Добрый день! Помогите, пожалуйста, написать алгоритм оптимального кодирования Хаффмена.


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru