2015-09-25 56 views
1

我有一個PublicKeyjava.security.PublicKey)。 我需要將它轉換成HEX字符串。X509公鑰HEX

就像您打開證書(例如在Windows上)並查看公鑰信息一樣。你會看到:

04 40 ad 77 10 45 08 f2 3a ae 1d 1d 95 22 2f b3 f5 e5 2f da db 8c 39 3a 03 15 fb 4b 36 28 46 de 7b 00 f4 73 11 ae b9 ac 00 aa 19 34 6d fb 7c 56 b1 93 c0 1b 86 7c d0 a2 0b 4d 22 a9 d2 4d b0 f6 34 c4(*)

任何想法如何做到這一點?

編輯:

我想:

Hex.encodeHexString(cert.getPublicKey.getEncoded) 

它返回我的字符串:

3063301c06062a8503020213301206072a85030202230106072a850302021e01034300_0440ad77104508f23aae1d1d95222fb3f5e52fdadb8c393a0315fb4b362846de7b00f47311aeb9ac00aa19346dfb7c56b193c01b867cd0a20b4d22a9d24db0f634c4 

此字符串包含十六進制值(*)(我把_它開始的地方)。

+3

那麼你有沒有嘗試*任何*尚未? 'PublicKey'有一個'getEncoded()'方法來返回字節,然後你只需要一個字節數組到十六進制轉換 - 這在Stack Overflow上有很多例子。 –

+0

@JonSkeet是的,我試過了。 'getEncoded'返回主編碼格式的密鑰。在我的情況下,它是X.509。那麼,如何解碼呢? –

+0

是什麼讓你覺得你需要解碼它?如果將'getEncoded()'返回的字節轉換爲十六進制,那麼與問題中顯示的十六進制進行比較的方式如何? –

回答

2

您在Java中擁有的名稱爲SubjectPublicKeyInfo,它確實在Java中指定。您可以在線查看here。我們可以看到它是俄羅斯GOST橢圓曲線公鑰。它包含公鑰格式的OID(對象標識符),橢圓曲線域參數和哈希標識符。

正如您還可以看到從Microsoft獲得的價值有點奇怪。實際公鑰值是:

ad77104508f23aae1d1d95222fb3f5e52fdadb8c393a0315fb4b362846de7b00f47311aeb9ac00aa19346dfb7c56b193c01b867cd0a20b4d22a9d24db0f634c4 

0440只是指出這個值被編碼爲一個八位組串(又名字節數組)。更準確地說,它是關鍵點:

(78460489894733727260622807718072211860518873236604684346084533999519831849728, 110567644507038660207162091352707227223755109412227308137485312229644099269828) 

在256位曲線上。通過將二進制字符串精確地通過middel(由於它們被編碼的方式,座標具有與曲線相同的尺寸),可以得到這些值。

現在,如果你想獲得公鑰的價值,你可以去(至少)兩種方式。要麼解析從getEncoded得到的字節,要麼找出PublicKey的實際類型,將其轉換爲該類型,然後使用特定類的附加功能來檢索有關公鑰的信息,例如橢圓曲線點。

+0

非常感謝你。我將公鑰轉換爲GostPublicKey,然後調用'getDecoded.asInstanceOf [SubjectPublicKeyInfo]'(來自'ru.CryptoPro.JCP.ASN.PKIX1Explicit88.SubjectPublicKeyInfo'包)。它有可能從SubjectPublicKeyInfo獲得subjectPublicKey,它返回我Asn1BitString。 –

0

您可以使用下面的代碼獲取與Windows相同的表示中的公鑰值。

PublicKey publicKey = ...; 
String publickKeyHexValue = Hex.toHexString(publicKey.getEncoded()); 

PS:我用BouncyCastle圖書館,特別是HEXorg.bouncycastle.util.encoders包。

相關問題