2011-02-09 92 views
3

我有一臺服務器,運行在python下,使用m2crypto簽署消息sha256摘要我使用由openssl CLI生成的公共和私有RSA密鑰。在服務器端everythgin是行
Python代碼:用openssl驗證數據簽名,使用crypto ++

專用密鑰= M2Crypto.RSA.load_key(sys.argv中[2])
signedDigest = privateKey.sign(消化, 'SHA256')

我仔細檢查簽名是正確的:

PUBKEY = M2Crypto.RSA.load_pub_key( 「key.pub.pem」)
如果pubKey.verify(消化,signedDigest「 (等....)

我將已簽名的sha256摘要存儲在一個文件中,並將其與原始消息一起發送給客戶端。
在客戶端,在C++ vc6下運行,我加載簽名的sha256摘要(二進制)和已簽名的消息。現在的目標是與簽署的sha256一起驗證該消息。我有cryptopp作爲靜態鏈接,並且我知道它工作正常,因爲我可以計算sha256,並與來自python的sha256比較具有相同的結果。這裏是代碼:

RSA :: PublicKey pubKey;
pubKey.Load(FileSource(LicenseControl :: pubKeyPath,true));
RSASS < PKCS1v15,SHA> ::驗證者驗證者(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簽署original_file
驗證OK

這證實了已簽名的sha256摘要是可以的,並且它可以用來使用公鑰驗證消息是否成功。我知道DER和PEM格式(使用PEM for openssl,DER for cryptopp)。所以我相信公鑰是正確的。 現在我的問題是如何使用cryptopp庫來驗證簽名? 我已經通過了文檔,但經過幾天,它仍然看起來像中國人。我嘗試過甲肝類似的事情

RSASS < PSSR,SHA> ::驗證驗證(PUBKEY);

使用PSSR在Python代碼加密,但沒有運氣... 我現在考慮只與公鑰解密簽署SHA256消化和我把它比作新SHA256摘要與接收文件計算。但即使如此簡單,我在文檔中找不到... 任何想法如何正確使用驗證器?
如何使用公鑰解密?如果前面的問題不能在這裏解決

回答

1

兩個問題,我認爲:

首先,SHA在RSASS< PKCS1v15, SHA >意味着SHA-1,不SHA_256。您需要在此處輸入SHA256

此外,VerifyMessage需要整個消息,而不僅僅是一個散列 - 該散列是在內部爲您計算的。所以現在,當你試圖驗證消息時,你實際上(就Crypto ++而言)試圖驗證SHA-1(SHA-256(msg)),所以很自然地失敗了。改爲傳遞整個實際消息,跳過額外的SHA-256計算。