![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Шифрование алгоритмом RSA [D7, WinXP]
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 глупо.