Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Есть две библиотеки:
Libtomcrypt, который реализует несколько киферов (включая RSA), и Либтомат, это реализует арифметику Bignum. Обе библиотеки находятся в открытом доступе, легко взламывать/изменять и имеют более простой интерфейс программирования, чем OpenSSL, и (очень) лучшая документация, чем OpenSSL.
В отличие от более старого общественного достояния код RSA, который я нашел ранее, Libtomcrypt может очень быстро генерировать новые клавиши, может импортировать клавиши, сгенерированные openssl, и поддерживает заполнение. Еще одна хорошая вещь в Libtomcrypt - это то, что у него нет дополнительных зависимостей (например, openssl для Windows хочет, например, GDI32) и меньше, чем OpenSSL.

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

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

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

Другие советы

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

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

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

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

Это соответствует всем вашим требованиям. Глянь сюда.

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

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

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

Как насчет MD5?

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

РЕДАКТИРОВАТЬ:
MD5 подходит, если вы хотите просто убедиться, что хранимых данных не могут быть изменены (или, по крайней мере, вы можете обнаружить его), но не скрывает данные. Обратите внимание, что если у вас должен быть ключ в вашем приложении вместе с данными, его всегда можно извлечь. Существуют методы скрытия ключа - популярный - просто поместить его в статический ресурс, такой как значок, который можно легко связать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top