Быстрый асимметричный шифр для приложения C ++ - PullRequest
2 голосов
/ 12 февраля 2010

Я ищу быстрый алгоритм асимметричного шифра, который будет использоваться в программе C ++. Наше приложение обращается к данным только для чтения, хранящимся в архиве (пользовательский формат, чем-то похожий на tar), и я хотел бы предотвратить любые модификации этого архива путем асимметричного шифрования индекса архива (я знаю, что это не идеальное решение и данные все еще могут быть извлечены и перепакованы с использованием определенных методов).

Некоторые отдельные файлы в архиве шифруются симметричным шифром, а ключи шифрования для них хранятся в индексе архива (заголовок). Вот почему я хочу асимметрично зашифровать заголовок архива.

Требования к шифру:
1) Реализация алгоритма должна быть независимой от платформы.
2) Алгоритм должен быть прост в реализации самостоятельно или должен быть доступен в библиотеке (с исходным кодом), который позволяет статическое связывание с проприетарным приложением, что означает, что лицензии GPL / LGPL / viral не могут использоваться. MIT / BSD-лицензированный код или код общественного достояния приемлем.
3) Если шифр доступен в библиотеке, в идеале он должен иметь небольшой объем памяти, а реализация должна быть компактной. Я бы предпочел использовать библиотеку C / C ++, которая реализует только один шифр, вместо полноценной универсальной коллекции шифров.

Изначально я хотел использовать RSA, но, похоже, он слишком медленный, чтобы быть полезным, и альтернатив не так много.

Итак, какой совет я могу использовать?

Ответы [ 5 ]

4 голосов
/ 18 февраля 2010

Хорошо, я нашел то, что искал, и я думаю, что он лучше, чем OpenSSL (по крайней мере, для моих целей).

Есть две библиотеки:
libtomcrypt , который реализует несколько шифров (включая RSA), и libtommath , который реализует арифметику bignum. Обе библиотеки находятся в свободном доступе, их легко взломать / изменить, и они имеют более простой интерфейс программирования, чем OpenSSL, и (намного) лучшую документацию, чем OpenSSL.
В отличие от старого rsa-кода публичного домена, который я обнаружил до , libtomcrypt может очень быстро генерировать новые ключи, может импортировать ключи, сгенерированные OpenSSL, и поддерживает заполнение. Еще одна полезная вещь в libtomcrypt заключается в том, что она не имеет дополнительных зависимостей (например, OpenSSL для Windows требует gdi32) и меньше, чем OpenSSL.

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

Что касается «медленного RSA», я немного изменил формат архива, так что теперь только небольшой кусок данных асимметрично шифруется. Невозможность расшифровки этого чанка сделает чтение индекса архива совершенно очень трудным, если не невозможным. Кроме того, я должен признать, что медлительность RSA была частично неправильным впечатлением, которое дал старый код , который я пытался использовать ранее.

Что значит, вопрос решен. Решение - RSA + libtomcrypt. RSA - потому что существует не так много альтернатив RSA и libtomcrypt - потому что он небольшой и общедоступный.

2 голосов
/ 12 февраля 2010

Ознакомьтесь с Curve25519, которая представляет собой криптографию с эллиптическими кривыми, реализованную эффективно, и вокруг патентных проблем.

Он отвечает всем вашим требованиям. Смотрите здесь .

Вы можете использовать его для шифрования или просто для подписи.

В качестве примечания:

Для проверки целостности достаточно MAC, если вам не нужно ассиметричное шифрование.

2 голосов
/ 12 февраля 2010

Используйте пользовательский RSA для подписи архива. Храните открытый ключ в приложении и храните закрытый ключ дома. Теперь любой может изменить архив только для чтения, но ваше приложение откажется загружать измененный архив.

2 голосов
/ 12 февраля 2010

OpenSSL должен сделать всю работу за вас. Он с открытым исходным кодом (лицензия Apache, поэтому соответствует вашим лицензионным требованиям).

Широко используется и хорошо протестирована.

1 голос
/ 12 февраля 2010

Как насчет MD5?

Да, я знаю, что MD5 был «сломан»; - но для большинства практических применений это не имеет значения.
Особенно, если измененные данные также должны быть действительными в конкретном формате данных, а также иметь правильный MD5

EDIT:
MD5 подходит, если вы хотите просто гарантировать, что сохраненные данные не могут быть изменены (или, по крайней мере, вы можете их обнаружить), но они не скрывают данные. Обратите внимание, что если у вас есть ключ в приложении вместе с данными, его всегда можно извлечь. Существуют способы скрытия ключа, популярным из которых является просто поместить его в статический ресурс, такой как значок, который можно легко связать.

...