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

аюсь портироватьAquaticPrime рамки для Mac для Windows.

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

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

Вот как проверка выполняется с openssl:

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

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

Начните с CryptAcquireContext (ctx, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)Используйте CryptImportKey с помощьюэто проводка, с pubexp = 3 и bitlen = 1024. Это все работает, то есть я не получаю ошибок, и я посмотрел на двоичные данные, чтобы убедиться, что они соответствуют тому, что показано в статье MSDN.Создайте дайджест 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.

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

Ответы на вопрос(2)

Ваш ответ на вопрос