codeBlogZ: Реализация RSA при помощи библиотеки GMP
Begemot
· 11 months ago
А на сколько тяжелее ехешник становится ?
codeBlogZ
· 11 months ago
Мне трудно сказать... Не знаю, отосительно чего измерить "тяжесть" :) Могу сказать, что статическая либа весит примерно полтора метра, при этом сама программа незначительно увеличивается при ее использовании. Никаких dll не требуется. По-моему замечательное подспорье самописным алгоритмам.
А вообще, лучше конечно же самому пощупать библиотеку и понять, насколько просто с ней обращаться.
Begemot
· 11 months ago
Мне уже щумать лениво, уже все работает. А работает - не трожь :) под утяжелением я имел ввиду - разницу в размере ехе до этой функциональности и после. Например добавление только проверки дса подписи с помощью Crypto++, увеличивало мне ехе на 180 кб по моему....
codeBlogZ
· 11 months ago
Я убрал из приложения 2 класса, реализующих алгоритмы Эль-Гамаля и Диффи-Хеллмана, и она стала весить на ~120КиБ меньше.
К тому же, Crypto++ славится своими трудноперевариваемыми проблемами, что не скажешь про GMP.
Sandy
· 11 months ago
И во сколько раз закриптованное число превышает int?
codeBlogZ
· 11 months ago
Эмм.. не понял вопроса
Sandy
· 11 months ago
Мне нужно закриптовать строку. Считываю ее, например, по 4 байта в массив unsigned int. Вопрос заключается в том, какого размера должны быть ключи, чтобы зашифрованное число не превышало максимума unsigned int?
codeBlogZ
· 11 months ago
На самом деле зашифрованная строка не может превышать исходный размер, она должна остаться такой же, если брать в рассчет симметричные схемы. И, в любом случае, ключ никак не может влиять на длину. В каком алгоритме выходит наоборот? Может я что не понимаю...
Begemot
· 11 months ago
В ассимеметричных алгоритмах по-моему шифрование\подпись идет кусками равными размеру ключа. хотя я точно не уверен может и глупость ляпнул:)
Sandy ты скажи лучше какую задачу ты хочешь решить, так будет легче ответить.
codeBlogZ, очень не удобно что не приходит на е-майл уведомления о новых ответах:(
codeBlogZ
· 11 months ago
Хм, ко мне приходит. Попробуй зарегистрироваться на сервисе disqus.com (через claim profile).
Begemot
· 11 months ago
Зарегистрировался, но это иделогически не правильно - слать только зарегистрированным:)
Sandy
· 11 months ago
Задача в следующем: 1. Есть строка, которую я через memcpy() преобразовываю к массиву беззнаковых интов. Генерирую ключи описанным выше способом. Раз работаю с интами, - SIZE = 16. Криптую. Вроде все ОК. 2. Но я человек дотошный, и не смотря на то, что это долго, решил проверить в цикле от 0 до максимум unsigned long, закриптовать, раскриптовать, сравнить результаты. Не все удачно. 3. Увеличиваю SIZE. Теперь все ОК. Но закриптованное число превышает максивальное значение unsigned long. Можно конечно хранить закриптованный результат в __int64, но не очень хочется вдвое увеличивать размер зашифрованного текста
codeBlogZ
· 11 months ago
А разве int не 4 байта? Это 32 бита, может в этом кроется проблема? На лицо проблема в алгоритме, видимо стоит его пересмотреть. А чтобы избежать таких проблем (при реализации криптографических алгоритмов с нуля они полюбому будут возникать), надо пользоваться готовыми и проверенными библиотеками - тем же GMP.
codeBlogZ
· 11 months ago
Коментарии куда-то пропали, попробую продублировать. Ты писал:
>Задача в следующем: >1. Есть строка, которую я через memcpy() преобразовываю к массиву беззнаковых интов. >Генерирую ключи описанным выше способом. Раз работаю с интами, - SIZE = 16. >Криптую. Вроде все ОК. >2. Но я человек дотошный, и не смотря на то, что это долго, решил проверить в цикле от 0 до >максимум unsigned long, закриптовать, раскриптовать, сравнить результаты. Не все удачно. >3. Увеличиваю SIZE. Теперь все ОК. Но закриптованное число превышает максивальное >значение unsigned long. >Можно конечно хранить закриптованный результат в __int64, но не очень хочется вдвое >увеличивать размер зашифрованного текста
А разве int не 4 байта? Это 32 бита, может в этом кроется проблема? На лицо проблема в алгоритме, видимо стоит его пересмотреть. А чтобы избежать таких проблем (при реализации криптографических алгоритмов с нуля они полюбому будут возникать), надо пользоваться готовыми и проверенными библиотеками - тем же GMP.
Sandy
· 11 months ago
>А разве int не 4 байта? Это 32 бита, может в этом кроется проблема? Я же об этом и говорю, если SIZE = 32, то закриптованное число превышает максимальный размер unsigned long Где-то еще я прочел, что блоки, на которые разбивается текст, должны быть размером log2(n) Надо еще и так попробовать. Для этого, как я понял придется кроме GMP еще и MPFR использовать.
codeBlogZ
· 11 months ago
Я ничего определенного сказать не могу, не увидев исходники твоей реализации. Возможно такая проблема существует, но по логике вещей ее трудно предусмотреть. Покопавшись в исходниках той же gmp я выснил, что они не используют ограниченные блоки памяти типо инта или лонга (что вполне логично) - они выделяют кусок памяти и работают с ней напрямую, как с массивом. В этом случае, можно надежно контролировать выходит ли наше число за разрядную сетку или нет.
Pahan
· 11 months ago
А можно ли использовать GMP из Delphi?
codeBlogZ
· 11 months ago
С Delphi не связывался, но думаю что препятствий для этого нету
Шумахер
· 10 months ago
Ну я лично пробовал и подтвержу,что препятсвий нет...с GMP уж точно.
Sandy
· 11 months ago
Таки да. Размер шифруемого блока должен быть log2(n). А чтобы не подключать MPFR и не писать log2() самому, можно воспользоваться вот таким приемом: [code] unsigned long msz = SIZE; mpz_t Chk; mpz_init2(Chk,SIZE); mpz_ui_pow_ui(Chk,2,msz); while (mpz_cmp(Chk,n)>0) { msz-=8; mpz_ui_pow_ui(Chk,2,msz); } [/code] Я пробовал при разных размерах ключей, - и получается размер блока на 1 байт меньше чем размер ключа, т.е., как правило проходит одна итерация.
Sandy
· 10 months ago
Не ответите на такой вопрос? Ключ - 1024 битный Во время криптования я зачитываю блоками например по 127 байт (mpz_import) На выходе ожидаю блоки по 128 байт (mpz_export) Но закриптованное число бывает и меньшего размера, а мне нужно, чтобы блоки были фиксированного размера (все по 128)
Sandy
· 9 months ago
У меня такая проблема: криптую текст для записи в файл использую mpz_export(buffer,&x,1,1,1,0,t); бывает x меньше размера блока, а нужно писать фиксированными блоками. Потому добавляю к buffer недосатющее количество нулевых байтов (0x00) при расшифровке в зачитанных блоках вычисляю с какого места начинается ряд нулевых байтов и зачитываю x=m_Size/8-1; // m_Size - размер в битах while (buffer[x]==(char)0x00) { x--; } x++; mpz_import(t,x,1,1,1,0,buffer); Иногда случается неправильное расшифрование. Мне кажется, что это связано именно с этими нулевыми байтами
asinxron
· 9 months ago
ссылка на "соответствующий архив проекта Visual Studio 2005/2008 " не рабочая
codeBlogZ
· 9 months ago
Спасибо за наводку. Пост поправил - автор переехал на другой домен.
asinxron
· 9 months ago
Скачал скомпилировал,спасибо...
asinxron
· 9 months ago
Только [code] #include <gmp.h> [/code] visual studio не видит.Помогите новичку: библиотеки gmp.lib и gmpxx.lib. подключать в resourse files?
codeBlogZ
· 8 months ago
Еще надо в инклудах прописать путь до установленной библиотеки. Тогда этот хэдер будет находится.
ruslrusl
· 8 months ago
Как скомпелировать библиотеку?? Скачал два архива, распаковал в одну папку, дальше что?? Работаю в Visual Studio c++ 2006
codeBlogZ
· 8 months ago
Найди файл gmp.sln и запусти в студии.
ruslrusl
· 8 months ago
Нашел этот файл. Запустил его в тудио. Так он его не компилировать, не построить не дает. Может какой-нить проект создать, потом там запустится?? если да, то какой проект, там их много.... помоги, плиз. буду благодарен....
codeBlogZ
· 8 months ago
Да, как я понимаю, у тебя студия версии 6.0. А в архиве лежат файлы проектов для 2005. Еще можно найти и для 2008. Так что выход один - поставить поновее MSVC.
P.S. Сорри, что не отвечал и комментарии пропадали - они все в спам пошли.
ruslrusl
· 8 months ago
А где находиться gmp.h.. я его вообще в архивах не нашел((
ruslrusl
· 8 months ago
скачал gmp.h с другого сайта, компилирую, ошибку выдает error C2065: SIZEOF_MP_LIMB_T: необъявленный идентификатор error C2099: инициализатор не является константой
codeBlogZ
· 8 months ago
Трудно мне сейчас предположить, в чем может быть проблема. Но запустив солюшн в своей студии и сбилдив проект, я не сталкивался с ними (кроме описанных в этом посте). Попробуй сделать все с самого начала: скачать gmp и интегратор под 2005 студию, запустить проект gmp.sln и скомпилировать либы.
Саша
· 7 months ago
А что такое cassert и где находится? Или он называется cassert.h?
codeBlogZ
· 7 months ago
cassert там и находится: #include <cassert>
это, если мне не изменяет память, обновленная версия устаревшего сишного варианта assert.h
Wizor
· 7 months ago
А вы gmpxx использовали? А то с gmp всё прекрасно работает, а при подключении gmpxx.h и указании компоновщику на gmpxx.lib ошибки начинают сыпаться пачками... =(
codeBlogZ
· 7 months ago
У меня вроде все нормально было.. Насколько я помню, при использовании gmpxx необходимо подключать библиотеки как и для прежнего gmp + gmpxx.lib. К сожалению, сейчас проверить нет возможности.
Swindy
· 7 months ago
У меня вопрос о том,как подключить gmp к c++ builder 2009?
codeBlogZ
· 7 months ago
Никогда не имел дело с этой IDE - не подскажу :(
Swindy
· 7 months ago
Понятно,спасибо
zvyozdo4ka
· 5 months ago
Здравствуйте! Огромное спасибо за ценный совет, но к сожалению, не ясно о каком архиве идет речь? У меня Ваша ссылка не открылась. Объясните, пожалуйста, в чём дело? Я нашла библиотеку gmp-4.3.1.tar.lzma , а как быть дальше? Куда скопировать и как работать? Что за архив? С уважением, Zvyozdo4ka
codeBlogZ
· 5 months ago
Разве эта ссылка не работает? - ftp://ftp.gmplib.org/pub/gmp-4.3.1/gmp-4.3.1.tar.gz
Это линуксовые архивы, их можно открыть тем же винраром, попробуйте.
ЗЫ. Со времени написания этой статьи уже достаточно времени прошло, ссылки становятся битыми, с этим я поделать ничего не могу :(
zvyozdo4ka
· 5 months ago
> Потом необходимо скачать > соответствующий архив проекта Visual Studio 2005/2008 — идем сюда ?> и находим ссылку на архив (для версии 4.2.4 — вот).
А для версии gmp-4.3.1.tar.gz, 2005 студии, где взять? Помогите, пожалуйста. Пишу важный проект по электронной цифровой подписи.
С уважением, Zvyozdo4ka
zvyozdo4ka
· 5 months ago
В какой каталог? Где его создать? Где находится gmp.sln?
zvyozdo4ka
· 5 months ago
ссылка на архив (для версии 4.2.4) тоже не открылась и найти её не могу. Не могли бы Вы мне прислать этот архив? Или если, возможно все, что необходимо, чтобы работать с данной библиотекой на с++ в студии 2005 или 2008.
Отвечая на это и предыдущее сообщение, сообщаю, что появились новые обстоятельства: данная библиотека GMP, написанная для использования в линуксе, была портирована под винду и поддерживается как отдельный проект. Подробности можно узнать на оффсайте: http://www.mpir.org/. Как пишется на сайте, этот проект совместим с GMP (по сути дали другое название).
Этот архив содержит каталог файл /build.vc9/mpir.sln, который необходимо сбилдить, чтобы получить рабочие либы. Другие подробности есть в файле readme.txt.
Успехов!
P.S. Работа с библитекой не должна отличаться от работы с GMP. Аспекты использования можно узнать из документации http://www.mpir.org/mpir-1.2.1.pdf
zvyozdo4ka
· 5 months ago
Спасибо, Вы очень добры
zvyozdo4ka
· 5 months ago
это опять я. у меня ссылка http://www.mpir.org/mpir-1.2.1.tar.gz не открывается. Я сначала думала, что потому, что на работе доступ гораничен, но и в других местах не открывается, а найти мне этот архив не удалось. Помогите пожалуйста.
codeBlogZ
· 5 months ago
Смотрите у себя в e-mail
zvyozdo4ka
· 5 months ago
Спасибо. Я почитала readme, но легче от этого не стало. =( Давайте, будем считать, что существуют не одаренные студенты. Я скопировала mpir-1.2.1 в папку Microsoft Visual Studio 2008 9.0\Projects. Затем открыла mpir.sln, потом F7 - build solution. А как правильно? В папке Microsoft Visual Studio 2008 9.0\Projects есть Ваша программа, реализующая алгоритм RSA, в которой написано: #include <gmp.h> . Но компиллятор не видит эту библиотеку. Как быть? Помогите, пожалуйста. С уважением, Zvyozdo4ka.
madlock
· 4 months ago
День добрый! Ваша статья помогла мне разобраться с основами GMP и алгоритмом rsa с примененим GMP. Сейчас я решаю задачу факторизации больших чисел. Как вы понимаете задача в некотором плане обратная алгоритму rsa. Всё получается, только вот бывает что прежде чем найти нужное решение программа делает сотни миллионов итераций и съедает всю оперативную память. Доку всю перечитал. В начале init, в конце clear, по идее не должно быть такого... Что делать не знаю... Может инитить временные переменные в главном цикле, а в конце их очищать? Даже не знаю как уловить утечку памяти. Если есть какие либо идеи, буду признателен
Bear90
· 2 months ago
при компиляции проекта выкидывает ошибку: 1>mpir.lib(add_ui.obj) : fatal error LNK1313: ijw/native module detected; cannot link with pure modules. Что делать подскажите? Очень срочно нужно
codeBlogZ
· 2 months ago
К сожалению, давно не имел дело с этой библиотекой (да и вообще с С++), и насколько я знаю, она ушла далеко вперед... Тут я ничем помочь не могу, увы.
А вообще, лучше конечно же самому пощупать библиотеку и понять, насколько просто с ней обращаться.
под утяжелением я имел ввиду - разницу в размере ехе до этой функциональности и после.
Например добавление только проверки дса подписи с помощью Crypto++, увеличивало мне ехе на 180 кб по моему....
К тому же, Crypto++ славится своими трудноперевариваемыми проблемами, что не скажешь про GMP.
Вопрос заключается в том, какого размера должны быть ключи, чтобы зашифрованное число не превышало максимума unsigned int?
Sandy ты скажи лучше какую задачу ты хочешь решить, так будет легче ответить.
codeBlogZ, очень не удобно что не приходит на е-майл уведомления о новых ответах:(
1. Есть строка, которую я через memcpy() преобразовываю к массиву беззнаковых интов.
Генерирую ключи описанным выше способом. Раз работаю с интами, - SIZE = 16.
Криптую. Вроде все ОК.
2. Но я человек дотошный, и не смотря на то, что это долго, решил проверить в цикле от 0 до максимум unsigned long, закриптовать, раскриптовать, сравнить результаты. Не все удачно.
3. Увеличиваю SIZE. Теперь все ОК. Но закриптованное число превышает максивальное значение unsigned long.
Можно конечно хранить закриптованный результат в __int64, но не очень хочется вдвое увеличивать размер зашифрованного текста
>Задача в следующем:
>1. Есть строка, которую я через memcpy() преобразовываю к массиву беззнаковых интов.
>Генерирую ключи описанным выше способом. Раз работаю с интами, - SIZE = 16.
>Криптую. Вроде все ОК.
>2. Но я человек дотошный, и не смотря на то, что это долго, решил проверить в цикле от 0 до >максимум unsigned long, закриптовать, раскриптовать, сравнить результаты. Не все удачно.
>3. Увеличиваю SIZE. Теперь все ОК. Но закриптованное число превышает максивальное >значение unsigned long.
>Можно конечно хранить закриптованный результат в __int64, но не очень хочется вдвое >увеличивать размер зашифрованного текста
А разве int не 4 байта? Это 32 бита, может в этом кроется проблема? На лицо проблема в алгоритме, видимо стоит его пересмотреть. А чтобы избежать таких проблем (при реализации криптографических алгоритмов с нуля они полюбому будут возникать), надо пользоваться готовыми и проверенными библиотеками - тем же GMP.
Я же об этом и говорю, если SIZE = 32, то закриптованное число превышает максимальный размер unsigned long
Где-то еще я прочел, что блоки, на которые разбивается текст, должны быть размером log2(n)
Надо еще и так попробовать. Для этого, как я понял придется кроме GMP еще и MPFR использовать.
[code]
unsigned long msz = SIZE;
mpz_t Chk;
mpz_init2(Chk,SIZE);
mpz_ui_pow_ui(Chk,2,msz);
while (mpz_cmp(Chk,n)>0) {
msz-=8;
mpz_ui_pow_ui(Chk,2,msz);
}
[/code]
Я пробовал при разных размерах ключей, - и получается размер блока на 1 байт меньше чем размер ключа, т.е., как правило проходит одна итерация.
Ключ - 1024 битный
Во время криптования я зачитываю блоками например по 127 байт (mpz_import)
На выходе ожидаю блоки по 128 байт (mpz_export)
Но закриптованное число бывает и меньшего размера, а мне нужно, чтобы блоки были фиксированного размера (все по 128)
криптую текст
для записи в файл использую mpz_export(buffer,&x,1,1,1,0,t);
бывает x меньше размера блока, а нужно писать фиксированными блоками. Потому добавляю к buffer недосатющее количество нулевых байтов (0x00)
при расшифровке в зачитанных блоках вычисляю с какого места начинается ряд нулевых байтов и зачитываю
x=m_Size/8-1; // m_Size - размер в битах
while (buffer[x]==(char)0x00) {
x--;
}
x++;
mpz_import(t,x,1,1,1,0,buffer);
Иногда случается неправильное расшифрование.
Мне кажется, что это связано именно с этими нулевыми байтами
P.S. Сорри, что не отвечал и комментарии пропадали - они все в спам пошли.
error C2099: инициализатор не является константой
#include <cassert>
это, если мне не изменяет память, обновленная версия устаревшего сишного варианта assert.h
А то с gmp всё прекрасно работает, а при подключении gmpxx.h и указании компоновщику на gmpxx.lib ошибки начинают сыпаться пачками... =(
Огромное спасибо за ценный совет, но к сожалению, не ясно о каком архиве идет речь? У меня Ваша ссылка не открылась. Объясните, пожалуйста, в чём дело? Я нашла библиотеку gmp-4.3.1.tar.lzma , а как быть дальше? Куда скопировать и как работать? Что за архив?
С уважением, Zvyozdo4ka
Это линуксовые архивы, их можно открыть тем же винраром, попробуйте.
ЗЫ. Со времени написания этой статьи уже достаточно времени прошло, ссылки становятся битыми, с этим я поделать ничего не могу :(
> соответствующий архив проекта Visual Studio 2005/2008 — идем сюда ?> и находим ссылку на архив (для версии 4.2.4 — вот).
А для версии gmp-4.3.1.tar.gz, 2005 студии, где взять? Помогите, пожалуйста. Пишу важный проект по электронной цифровой подписи.
С уважением, Zvyozdo4ka
Где находится gmp.sln?
Заранее благодарю.
почта: yulduzprogramist@mail.ru или yulduzprogramist@yandex.ru
Ссылка для скачивания: http://www.mpir.org/mpir-1.2.1.tar.gz (архив без проблем открывается винраром).
Этот архив содержит каталог файл /build.vc9/mpir.sln, который необходимо сбилдить, чтобы получить рабочие либы. Другие подробности есть в файле readme.txt.
Успехов!
P.S. Работа с библитекой не должна отличаться от работы с GMP. Аспекты использования можно узнать из документации http://www.mpir.org/mpir-1.2.1.pdf
С уважением, Zvyozdo4ka.
Ваша статья помогла мне разобраться с основами GMP и алгоритмом rsa с примененим GMP.
Сейчас я решаю задачу факторизации больших чисел. Как вы понимаете задача в некотором плане обратная алгоритму rsa. Всё получается, только вот бывает что прежде чем найти нужное решение программа делает сотни миллионов итераций и съедает всю оперативную память. Доку всю перечитал. В начале init, в конце clear, по идее не должно быть такого...
Что делать не знаю... Может инитить временные переменные в главном цикле, а в конце их очищать? Даже не знаю как уловить утечку памяти. Если есть какие либо идеи, буду признателен
насколько я знаю, она ушла далеко вперед... Тут я ничем помочь не могу, увы.
2009/10/5 Disqus <>