我正在尝试使用RSA使2个应用程序互相通信。第一个是c++,第二个是java。第一个需要向Java应用程序发送公钥。我正在使用
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。您能告诉我如何导入/导出密钥吗?
最佳答案
您将必须为Microsoft RSA公钥结构编写一个解码器。幸运的是that structure is well defined。注意,它使用little-endian编码,因此您可以先将ByteBuffer
setting the order中的结构包装到little-endian。
然后,您应该使用BigInteger
将公共(public)指数和模量部分转换为BigInteger.valueOf(1, bigEndianByteArray)
。技巧是从bigEndianByteArray
中读取字节后,以正确的顺序获取ByteBuffer
中的字节。