2011-02-07 4 views
8

Я пытаюсь подключить фреймворк AquaticPrime для Mac к Windows.CryptoAPI: Использование CryptVerifySignature для проверки подписи с openssl с открытым ключом

На Mac он использует библиотеку opensll, и я пытаюсь понять, как переносить это в Windows, где я должен использовать CryptoAPI, я думаю.

Мне в основном нужен код для проверки сгенерированной подписи с данным открытым ключом.

Вот как проверка осуществляется с помощью OpenSSL:

  1. входы: данные лицензии, открытый ключ и подпись, как 128 байт длиной.
  2. Сборник SHA1 рассчитывается на основе данных лицензии.
  3. RSA контекст устанавливаются с открытым ключом данными
  4. RSA_public_decrypt() называются, дал ключ RSA и подпись, которая возвращает 20 байт длинного SHA1 дайджест - это переварить равные один из шага 2, подпись действительна.

Итак, как мне это сделать с помощью CryptoAPI? Я получил это далеко:

  1. Начать с CryptAcquireContext (СТХ, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)
  2. Использование CryptImportKey с помощью this проводки, с pubexp = 3 и bitlen = 1024. Все это работает, то есть я не получаю ошибок, и я смотрел на двоичные данные, чтобы убедиться, что они соответствуют тому, что показывает статья MSDN.
  3. Создайте дайджест SHA1 из данных лицензии. Я получил полученное 20-байтовое значение хэша и вижу, что он соответствует тому, что я получаю с помощью openssl на Mac.

На данный момент, я называю:

CryptVerifySignature (hashHdl, sig, sigLen, keyHdl, 0, 0) 

Это терпит неудачу с кодом ошибки ERROR_INVALID_PARAMETER.

Нечетным является то, что, когда я впервые случайно сохранил двойной открытый ключ в структуре PUBLICKEYBLOB, вместо этого я получил ошибку NTE_BAD_SIGNATURE. Это может означать, что теперь открытый ключ, который я передаю, является правильным.

Почему ошибка ERROR_INVALID_PARAMETER сейчас? Я проверил, что значение хеша правильное, и ключ также считается принятым. И параметр «sig» - это просто указатель на 128 байт подписи, а sigLen - 128.

Итак, что мне здесь не хватает?

+1

Вопрос: Почему бы вам не использовать версию OpenSSL для Windows [ported] (http://www.slproweb.com/products/Win32OpenSSL.html)?Я имею в виду, что нет ничего плохого в использовании CryptoAPI, но openSSL уже существует, и это будет означать меньше работы ... – erloewe

+0

Я не хочу, чтобы люди устанавливали новые системные компоненты только для запуска приложения, которое в противном случае даже не требует установки. –

ответ

9

ОК, я решил проблему после многих проб и ошибок.

Как подпись, так и данные открытого ключа, когда в форме их чистой байтовой строки необходимо изменить, то есть сначала байт в последнюю позицию и т. Д. Тогда выше работает.

+1

Я думаю, что у меня возникает аналогичная проблема, как вы узнали, что данные подписи и открытых ключей нужно переломить? –

+0

Получил !, вывод функций подписи и шифрования CryptoAPI находится в маленьком концевом формате! –

+0

Рад видеть, что вы можете проверить мои выводы. Тогда мой пост здесь не был напрасно :) –

-3

Компилировать и связывать OpenSSL libCrypto статически. Это можно сделать, я видел это у бывшего работодателя.

 Смежные вопросы

  • Нет связанных вопросов^_^