Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Шифрование алгоритмом RSA [D7, WinXP]


Страницы:   1 2 3

cr@nk ©   (2011-01-15 23:30:00) 

Задается исходная строка и надо зашифровать её по алгоритму RSA
Для работы с большими числами скачал библиотеку FGInt ( http://www.submanifold.be/triade/GInt/gint.html  RSA.zip) . В архиве прилагается пример шифрования строки.
Подгоняю данные в их исходнике под пример из http://ru.wikipedia.org/wiki/RSA#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80(просто фиксировано задаю переменные E, D, N)
program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils,
 FGInt,
 FGIntPrimeGeneration,
 FGIntRSA;

Var
 n, e, d : TFGInt;
 test : String;
Begin
 Base10StringToFGInt('3', e);
 Base10StringToFGInt('9173503', n);
 Base10StringToFGInt('6111579', d);
 RSAEncrypt('111111', e, n, test);
 writeln(test);
 readln;
End.

Получаю UА_n‹@k‘вместо 4051753

Также нашёл в сети пару программ ( http://dl.dropbox.com/u/4653598/RSA_sample.rar), демонстрирующих работу с RSA. В них видимо идентичный код, т.к. на выходе получаются идентичные данные
При значениях E= 7, N=697, D=183 и входной строке 111111получаю 535 535 535 535 535 535
Если эти же значения использовать с модулями от FGInt, то получаем на выходе получаем \x2\x15Ц §1–c.
Есть догадка, что в модуле от FGInt присутствует какая-то "добавка", которая в корне меняет конечный результат. Но также в тех 2-х программах очень не нравится выходная строка - одинаковые тройки чисел.

Что-то так много всего написал, что не знаю, как правильно сформулировать вопрос :)
Наверное хотелось бы увидеть нормальный модуль или пример, где реализован чистый алгоритм RSA, позволяющий шифровать отдельно текст, а не сами файлы на жёстком диске.
Второй день бьюсь над решением этой задачи

P.S.: При использовании модулей FGInt в Delphi 2010, XE возникает ошибка, если вызывать одну из функций (замечал это на функции Base256StringToFGInt). Эту информацию привожу для справки... вдруг она тоже окажется полезной


cr@nk   (2011-01-26 06:51:00) [21]


>
> Ну естественно! Забудь про TMemo! И про другие визуальные компоненты, показывающие текст.

Спасибо за объяснения. Буду искать приемлемый выход из данной ситуации :)


cr@nk   (2011-01-26 06:47:00) [22]

Ещё попробовал сравнить посимвольно глобальную переменную и reCryptoText.Lines.Text вот в таком вот простом цикле
 With ListBox1.Items Do
 begin
   Clear;
   Add('GLOBAL'+inttostr(length(global_test))+' - RICHEDIT'+inttostr(length(reCryptoText.Lines.Text)));
   For i:=0 To length(global_test)-1 Do
   begin
   ADD (global_test[i]+' - '+reCryptoText.Lines.Text[i])
   end;

 end;

Шифроуем слово test
Получаем:
_E\xB
Ж|e?=


GLOBAL8 - RICHEDIT12

_ - _
E - E
\xB - \xB
Ж -

| -

e - Ж
? - |

В самой первой строке отображается сколько символов в глобальной переменной и сколько их в RchEdit


Германн   (2011-01-26 06:35:00) [23]


> т.к. в Tmemo и прочем зашифрованный текст получается уже
> искажен (видимо самим компонентом)

Ну естественно! Забудь про TMemo! И про другие визуальные компоненты, показывающие текст.
Зачем вообще тебе понадобился сей компонент? Проверить правильность работы процедуры шифрования? Тогда ты ошибся. Он для такой проверки не годится! Зашифрованный текст нужно смотреть в HEX-редакторе (вьювере). А сохранять его нужно в любой приемлемый бинарный буфер.
P.S. Строка (String) тоже является таким буфером.


cr@nk   (2011-01-26 06:23:00) [24]

RSADecrypt(reCryptoText.Lines.Text, d, n, Nilgint, Nilgint, Nilgint, Nilgint, test);
Это я пробовал сразу. Результат отрицательный

А что получается?
Пример:
Входная строка:
01234567890123456789012345678901234
Зашифрованный текст:
\x5 “
_?G\x3л/•\x1Bw\x14ж}]O\xCcP?.Щ\x1A№\xBgХ?7G-pЛ6\x1B]v

После попытки расшифровать этот текст получаем:
\x13ж6Ї\x10


>
> Ну так записывай в глобальную переменную, если иначе не
> получается.
> P.S.
> Или ты в процедуре шифрования записываешь результат в TMemo? Ну тогда ССЗБ.

Так ситуация такая получается: на одном компе шифруем текст, сохраняем его в файл, переносим на другой ПК, загружаем его и пытаемся расшифровать. Но на данный момент это бессмысленно, т.к. в Tmemo и прочем зашифрованный текст получается уже искажен (видимо самим компонентом)


Германн   (2011-01-26 05:28:00) [25]


> не получается первоначальный текст
>

А что получается?

> Если же в процедуре шифрования bnCryptoClick зашифрованный
> текст записать в глобальную переменную (например, global_test),
>  то расшифровка проходит нормально

Ну так записывай в глобальную переменную, если иначе не получается.

P.S.
Или ты в процедуре шифрования записываешь результат в TMemo? Ну тогда ССЗБ.


Ega23   (2011-01-26 00:25:00) [26]

test:=reCryptoText.Lines.Text;
RSADecrypt(test, d, n, Nilgint, Nilgint, Nilgint, Nilgint, test);


А если
RSADecrypt(reCryptoText.Lines.Text, d, n, Nilgint, Nilgint, Nilgint, Nilgint, test);
?


cr@nk   (2011-01-25 23:06:00) [27]

Если надо ещё что-то сообщить, то с радостью :)
Ибо самому решить никак не получается


cr@nk   (2011-01-24 05:24:00) [28]

При расшифровке текста
test:=reCryptoText.Lines.Strings[0];
ИЛИ
test:=reCryptoText.Lines.Text;
RSADecrypt(test, d, n, Nilgint, Nilgint, Nilgint, Nilgint, test);

не получается первоначальный текст

Если же в процедуре шифрования bnCryptoClick зашифрованный текст записать в глобальную переменную (например, global_test), то расшифровка проходит нормально
 test:=reOriginalText.Lines.Text;
 RSAEncrypt(test, e, n, test);
 global_test:=test;
 reCryptoText.Lines.Text:=test;

=====================================
 RSADecrypt(global_test, d, n, Nilgint, Nilgint, Nilgint, Nilgint, test);
 reOriginalText.Lines.Text:=test;

А если зашифрованный текст брать из визуального компонента (как в исходниках), товсё перестаёт работать


Германн   (2011-01-24 02:55:00) [29]


>  cr@nk ©   (23.01.11 10:09) [13]
>
> Пример: http://dl.dropbox.com/u/4653598/TestCrypto.rar
>

Это не то, что я имел в виду.
Проблемы (ошибки) в коде не указаны.


cr@nk   (2011-01-23 10:09:00) [30]

Пример: http://dl.dropbox.com/u/4653598/TestCrypto.rar
Если архив не скачивается, то дайте знать - отзеркалю ещё куда-нибудь


Германн   (2011-01-23 02:23:00) [31]


> cr@nk ©   (17.01.11 17:54) [8]
>
> Подскажите пожалуйста решение дальнейшей проблемы - при
> шифровании может случиться так, что зашифрованная строка
> будет содержать #10#13 (мне кажется, что именно их) и в
> результате не получается правильно декодировать строку


> cr@nk ©   (22.01.11 23:02) [11]
>
>
> > stas ©   (20.01.11 17:13) [9]
>
> Там больше про CryptoAPI .  Его я собираюсь попозже изучать
>
> > FGInt - хороший, годный модуль. Не волнуйся.
>
> Успокоили :)
>
> Скажите, а есть рабочий пример с FGInt и использовании многострочных
> компонентов типа Memo, RichEdit
>

А в чём собственно проблемы?
Чем тебе мешают символы LF/CR?
Ты приведи свой код. Тогда посмотрим и найдём ошибки.


cr@nk   (2011-01-22 23:02:00) [32]


> stas ©   (20.01.11 17:13) [9]

Там больше про CryptoAPI .  Его я собираюсь попозже изучать

> FGInt - хороший, годный модуль. Не волнуйся.

Успокоили :)

Скажите, а есть рабочий пример с FGInt и использовании многострочных компонентов типа Memo, RichEdit


Ega23   (2011-01-20 18:15:00) [33]


> Просто хотелось быть уверенным, что это именно чистый алгоритм
> и некая сферическая программа, написанная другим человеком
> будет совместима с моей :)


FGInt - хороший, годный модуль. Не волнуйся.


stas   (2011-01-20 17:13:00) [34]

вот еще тема http://delphimaster.ru/cgi-bin/forum.pl?id=1292509828&n=3


cr@nk   (2011-01-17 17:54:00) [35]

Подскажите пожалуйста решение дальнейшей проблемы - при шифровании может случиться так, что зашифрованная строка будет содержать #10#13 (мне кажется, что именно их) и в результате не получается правильно декодировать строку
Пример: http://dl.dropbox.com/u/4653598/TestCrypto.rar


cr@nk   (2011-01-16 18:10:00) [36]


> Anatoly Podgoretsky  (16.01.11 12:00) [6]

Ну такую проверку я осуществлял средствами модуля FGInt и тексты совпадали :)
Просто хотелось быть уверенным, что это именно чистый алгоритм и некая сферическая программа, написанная другим человеком будет совместима с моей :)


Anatoly Podgoretsky   (2011-01-16 12:00:00) [37]

> cr@nk  (16.01.2011 08:52:04)  [4]

Проверить просто, надо попытаться расшифровать зашифрованые данные, если
расшифруешь и они будут равны исходным, то работает правильно.


CrytoGen   (2011-01-16 11:09:00) [38]

если вы не можете эти данные проверить, то дело плохо :)


cr@nk   (2011-01-16 08:52:00) [39]

Ясно. Т.е. в целом FGInt выдаёт верные данные?
Проверить бы как-нибудь


CrytoGen   (2011-01-16 08:04:00) [40]

RSAEncrypt('111111', e, n, test); работает не с десятичными данными, это обычная строка, так что ожидать результата в виде 4051753 глупо.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо