проверить подпись данных, сгенерированных с помощью openssl, используя crypto ++ - PullRequest
3 голосов
/ 09 февраля 2011

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

privateKey = M2Crypto.RSA.load_key (sys.argv [2])
signatureDigest = privateKey.sign (digest, 'sha256')

Я дважды проверяю, что подпись хороша:

pubKey = M2Crypto.RSA.load_pub_key ("key.pub.pem")
if pubKey.verify (digest, signatureDigest, 'sha256') (и т. д ....)

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

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

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

openssl dgst -sha256 -верифицировать key.pub.pem -подпись подписи original_file
Проверено ОК

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

RSASS :: Верификатор верификатора (pubKey);

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

1 Ответ

1 голос
/ 30 июня 2011

Два вопроса здесь, я думаю:

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

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

...