2015-10-15 77 views
0

我正試圖計算一個公鑰的哈希值,以匹配ApplePay給我的值。我無法在C#中獲得BouncyCastle以正確的格式給我公鑰,所以我可以對它進行哈希處理。然而,我正在移植的Java版本工作得很好。 OpenSSL也給出了正確的響應,但我不想處理OpenSSL和BC來做到這一點。BouncyCastle編碼差異

的Java:(作品)

ECPublicKey key = (ECPublicKey) certificate.getPublicKey(); 
byte[] keyBytes = key.getEncoded(); 

MessageDigest messageDigest = MessageDigest.getInstance("SHA256", PROVIDER_NAME); 
byte[] keyHash = messageDigest.digest(keyBytes);  

String base64keyBytes = new String(Base64.encode(keyBytes)); 
//base64keyBytes == MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+4wQWWRnPqGlsncZX17t0CfLOl6u 
// 68aXUsqnzlIcpCdDukHhxibd2MjHPFGpnK3ZKdHxIFh+NBQvGssM5ncm1g== 
// line break added for readability 

OpenSSL:它(作品)

openssl x509 -noout -pubkey -in <file> -inform der 
-----BEGIN PUBLIC KEY----- 
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+4wQWWRnPqGlsncZX17t0CfLOl6u 
68aXUsqnzlIcpCdDukHhxibd2MjHPFGpnK3ZKdHxIFh+NBQvGssM5ncm1g== 
-----END PUBLIC KEY----- 

C#:(keyBytes是錯誤的)

SubjectPublicKeyInfo pubinfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(certificate.GetPublicKey()); 
byte[] keyBytes = pubinfo.GetEncoded(); 

byte[] keyHash = DigestUtilities.CalculateDigest("SHA_256", keyBytes); 

string keyBytesEncoded = Convert.ToBase64String(keyBytes); 
/*keyBytesEncoded == MIIBKjCB4wYHKoZIzj0CATCB1wIBATAsBgcqhkjOPQEBAiEA/////wAAAAEAAA 
AAAAAAAAAAAAD///////////////8wWwQg/////wAAAAEAAAAAAAAAAAAAAAD/ 
//////////////wEIFrGNdiqOpPns+u9VXaYhrxlHQawzFOw9jvOPD4n0mBLAx 
UAxJ02CIbnBJNqZnjhE50mt4GffpAEIQNrF9Hy4SxCR/i85uVjpEDydwN9gS3r 
M6D0oTlF2JjClgIhAP////8AAAAA//////////+85vqtpxeehPO5ysL8YyVRAg 
EBA0IABPuMEFlkZz6hpbJ3GV9e7dAnyzperuvGl1LKp85SHKQnQ7pB4cYm3djI 
xzxRqZyt2SnR8SBYfjQULxrLDOZ3JtY= 
line break added for readability */ 

什麼是端口的正確方法GetEncoding?

我知道這是錯誤的關鍵數據,因爲當我從openssl手動強制數據時,我得到正確的散列。

編輯:增加了出。

+0

你能不能也顯示調用Java和C#'GetEncoded'的(在基地64或十六進制數)的輸出? –

+0

添加了相應的輸出。 – dsmithpl13

+0

我必須對這一個犯規。 Java的MessageDigest.digest()方法的base64編碼輸出沒有辦法像您所描述的那樣。請發佈正確的代碼/輸出,這可能只是getEncoded()輸出的base64編碼,而這些都不是散列。 –

回答

1

我覺得這純粹是:

byte[] keyBytes = certificate.CertificateStructure.SubjectPublicKeyInfo.GetDerEncoded() 
+0

哇謝謝你!我只是準備下拉Java源代碼,看看它與C#有什麼不同。 – dsmithpl13