Что такое библиотека C ++ с ECDiffieHellmanCng-совместимой реализацией? - PullRequest
2 голосов
/ 25 января 2010

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

Существует хорошая библиотека C ++, crypto ++ , которая реализует ECDH и подходит для встроенного устройства. Однако его реализация ECDH отличается от реализации Mirosoft ECDiffieHellmanCng (как упоминалось в FAQ ). Мы хотели бы оставаться совместимыми с алгоритмами безопасности .NET, чтобы мы могли придерживаться управляемого кода для приложения для ПК (сейчас, или если мы будем использовать CNG, когда мы когда-нибудь выпустим XP).

Кто-нибудь видел реализацию, кроме Microsoft, которая совместима с Microsoft? В качестве альтернативы, существуют ли другие хорошие решения для обмена ключами между кодом .NET и встроенным кодом C ++ для использования с предварительно общими ключами?

Обновление 2010-01-27: Чтобы уточнить, я пытаюсь использовать ECDH для выполнения двусторонней аутентификации и обмена ключами между двумя конечными точками ad-hock, которые не доверяют друг другу, пока не увидят, что они совместно используют тот же секрет. Это похоже на сценарий сопряжения Bluetooth, когда общий секретный ключ передается вне полосы (за исключением того, что в моем случае устройства могут не находиться рядом друг с другом).

Ответы [ 3 ]

1 голос
/ 26 января 2010

Для совместимости вам лучше использовать RSA. Вы не найдете много бесплатных реализаций ECC из-за патентного минного поля.

Как насчет того, чтобы одна сторона генерировала случайный ключ, зашифровывала его открытым ключом другой стороны и подписывала своим собственным закрытым ключом. Затем другая сторона может проверить подпись и расшифровать общий ключ.

Если вы беспокоитесь о повторных атаках (обратите внимание, что схема ECDH, которую вы планировали использовать, не защищала от них - если только вы не планировали использовать эфемерные ключи), вы можете попросить обе стороны сгенерировать случайный ключ, зашифровав его открытый ключ другой стороны, а затем каким-то образом объединить два ключа.

Еще лучше, вероятно, использовать некоторый стандартный протокол: рассмотрим TLS с проверкой сертификата клиента. Вы можете жестко закодировать клиентские и серверные сертификаты.

1 голос
/ 26 января 2010

Ничто в приведенном вами ответе на часто задаваемые вопросы о реализации КПГ так или иначе не упоминается. Я думаю, что утверждения в FAQ в целом верны, особенно ситуация с патентами. Тем не менее, существуют некоторые стандарты, и в частности, NIST США опубликовал некоторые стандарты. См., Например, Рекомендация для схем установления парных ключей с использованием криптографии с дискретным логарифмом .

0 голосов
/ 25 января 2010

OpensSSL имеет порт для Visual Studio

...