我正在尝试使用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中的字节。

10-04 14:58