проверить подпись данных, сгенерированную с помощью openssl, используя crypto ++

У меня есть сервер, работающий под управлением Python, подписывающий дайджест сообщения sha256 с помощью m2crypto. Я использую открытый и закрытый ключ RSA, сгенерированный openssl CLI. На стороне сервера все в порядке
Код Python:

privateKey = M2Crypto.RSA.load_key (sys.argv [2])
signedDigest = privateKey.sign (дайджест, 'sha256')

Я дважды проверяю правильность подписи:

pubKey = M2Crypto.RSA.load_pub_key ("key.pub.pem")
если pubKey.verify (digest, signedDigest, 'sha256') (и т. д.)

Я сохраняю подписанный дайджест sha256 в файле и отправляю его клиенту вместе с исходным сообщением.
На стороне клиента, работающей под управлением c ++ vc6, я загружаю подписанный дайджест sha256 (как двоичный) и сообщение, которое было подписано . Теперь цель состоит в том, чтобы проверить сообщение вместе с подписанным sha256. У меня есть cryptopp в качестве статической ссылки, и я знаю, что он работает нормально, потому что я могу вычислить sha256 и сравнить с sha256 из python с тем же результатом. Вот код:

RSA :: PublicKey pubKey;
pubKey.Load (FileSource (LicenseControl :: pubKeyPath, true));
RSASS ‹PKCS1v15, SHA> :: Verifier verifier (pubKey);
// shaDigest заново вычислен sha256, signatureByte - это подпись сообщения, полученного от сервера
result = verifier.VerifyMessage (shaDigest, CryptoPP :: SHA256 :: DIGESTSIZE, signatureByte, 512);

Это компилируется и запускается, но всегда возвращает false. Чтобы убедиться, что подпись действительна, я проверил ее, используя непосредственно openssl CLI (а не через оболочку m2crypto python):

openssl dgst -sha256 -verify key.pub.pem -signature подписать исходный_файл
Подтверждено ОК

Это подтверждает, что подписанный дайджест sha256 в порядке и что его можно использовать для успешной проверки сообщения с использованием открытого ключа. Я знаю формат DER и PEM (использую PEM для openssl, DER для cryptopp). Итак, я считаю, что открытый ключ правильный. Теперь моя проблема в том, как использовать библиотеку cryptopp для проверки подписи ??? Я просмотрел документ, но после нескольких дней работы он все еще кажется мне китайским. Я пробовал что-то вроде

RSASS ‹PSSR, SHA> :: Verifier verifier (pubKey);

используя PSSR для шифрования в коде Python, но не повезло ... Сейчас я рассматриваю возможность расшифровать только с открытым ключом подписанный дайджест sha256 и сравнить его сам с новым дайджестом sha256, вычисленным из полученного файла. Но даже этого я не нашел в документе ... Есть идеи, как правильно использовать верификатор?
Как расшифровать с помощью открытого ключа? в случае, если предыдущий вопрос не может быть решен


person Bastien Auneau    schedule 09.02.2011    source источник


Ответы (1)


Я думаю, здесь есть две проблемы:

Во-первых, SHA в RSASS< PKCS1v15, SHA > означает SHA-1, а не SHA_256. Вместо этого вы хотите SHA256 здесь.

Кроме того, VerifyMessage принимает все сообщение, а не только хеш - хеш вычисляется для вас внутри. Итак, прямо сейчас, когда вы пытаетесь проверить сообщение, вы на самом деле (что касается Crypto ++) пытаетесь проверить SHA-1 (SHA-256 (msg)), поэтому, естественно, это не удается. Вместо этого передайте фактическое сообщение целиком, пропуская дополнительные вычисления SHA-256.

person Jack Lloyd    schedule 30.06.2011