2013-06-22 106 views
1

我試圖讓2個apllications使用RSA互相交談。第一個是用C++,第二個用java。首先需要將公鑰發送給java應用程序。我正在使用一個Java和C++(VS)RSA加密

CryptExportKey(m_hCryptKey, NULL, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBlobLen); 

功能。 在Java應用程序中,我試圖使用此功能將其導入:

public PublicKey getPublicKeyFromBytes(byte[] keyBytes) throws NoSuchAlgorithmException, InvalidKeySpecException { 
    KeyFactory keyFactory; 
    keyFactory = KeyFactory.getInstance("RSA"); 
    X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(keyBytes); 
    return keyFactory.generatePublic(pubKeySpec); 
} 

它拋出InvalidKeySpecException。你能告訴我我該如何導入/導出密鑰?

+0

顯然,C++側不發送只是原始密鑰字節,但你爲什麼不使用SSL? – EJP

+2

CryptExportKey以非標準,專有的,Microsoft定義的格式返回數據。 –

+0

@GregS可能這個時候只,[微軟並經過指定結構的運動(http://msdn.microsoft.com/en-us/library/windows/desktop/aa375601%28v=vs.85% 29.aspx),因此解析應該相對簡單(使用'ByteBuffer'是個好主意,因爲它似乎都使用小端編碼)。 –

回答

1

你將不得不寫的微軟RSA公共密鑰結構的解碼器。幸運的是that structure is well defined。請注意,它使用little-endian編碼,因此您可以首先將結構以ByteBuffersetting the order包裝爲little-endian。

那麼你應該使用BigInteger.valueOf(1, bigEndianByteArray)轉換公用指數和模件到BigInteger。訣竅是在從ByteBuffer中讀取它們後,按照正確順序獲取bigEndianByteArray中的字節。

+0

任何問題我的回答,黑色的嗎?您是否成功導入Java結構。請跟進你的問題! –