【问题标题】:Java and C++ (VS) RSA encryptionJava 和 C++ (VS) RSA 加密
【发布时间】:2013-06-19 19:54:20
【问题描述】:

我正在尝试使用 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。你能告诉我我应该如何导入/导出密钥吗?

【问题讨论】:

  • 很明显 C++ 端不只是发送原始密钥字节,但你为什么不使用 SSL?
  • CryptExportKey 以非标准的、专有的、Microsoft 定义的格式返回数据。
  • @GregS 可能只是这次,Microsoft did go through the motions of specifying the structure,所以解析起来应该相对简单(使用ByteBuffer 是个好主意,因为它似乎都使用小端编码) .
  • 如果您发布一些(示例)公钥 blob,我可以查看是否可以对其进行解码...

标签: java c++ visual-studio encryption


【解决方案1】:

您必须为 Microsoft RSA 公钥结构编写解码器。幸运的是that structure is well defined。请注意,它使用 little-endian 编码,因此您可以先将结构包装在 ByteBuffer setting the order 到 little-endian。

然后您应该使用BigInteger.valueOf(1, bigEndianByteArray) 将公共指数和模数部分转换为BigInteger。诀窍是在从ByteBuffer 读取它们之后,以正确的顺序获取bigEndianByteArray 中的字节。

【讨论】:

  • 我的回答有什么问题吗,黑人?您是否成功地在 Java 中导入了该结构。请跟进您的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2014-07-12
  • 2012-06-02
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多