DISQUS

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.

    Заранее благодарю.

    почта: yulduzprogramist@mail.ru или yulduzprogramist@yandex.ru
  • codeBlogZ · 5 months ago
    Отвечая на это и предыдущее сообщение, сообщаю, что появились новые обстоятельства: данная библиотека GMP, написанная для использования в линуксе, была портирована под винду и поддерживается как отдельный проект. Подробности можно узнать на оффсайте: http://www.mpir.org/. Как пишется на сайте, этот проект совместим с GMP (по сути дали другое название).

    Ссылка для скачивания: 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 · 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
    К сожалению, давно не имел дело с этой библиотекой (да и вообще с С++), и
    насколько я знаю, она ушла далеко вперед... Тут я ничем помочь не могу, увы.

    2009/10/5 Disqus <>