【发布时间】:2017-01-05 17:27:03
【问题描述】:
我有一个用 java 编写的服务器,可以生成 RSA 密钥对。我想在 C++ 客户端中使用私钥进行解密。
这是我用来创建私钥的代码:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(4096);
KeyPair keyPair = keyGen.genKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
byte[] encoded = privateKey.getEncoded();
String b64Encoded = Base64.getEncoder().encodeToString(encoded);
然后我保存 base64 编码的字符串并尝试将其作为私钥加载到我的 cpp 代码中。
我将base64字符串解码为二进制数组,然后使用以下代码尝试加载私钥(encodedString应该是从base64解码后的DER编码数据):
ByteQueue queue;
StringSource ss(encodedString,true);
ss.TransferTo(queue);
queue.MessageEnd();
key.BERDecodePrivateKey(queue, false , queue.MaxRetrievable());
但是,这段代码总是崩溃并出现异常:CryptoPP::BERDecodeErr。
我相信这两个库都使用 PKCS#8 对关键参数进行编码。
注意:当我使用 crypto++ 创建密钥对然后对其进行编码 (DER + base64) 时,我得到一个 3172/3176 字符字符串,而在我的 java 代码中我得到一个 3168 字符字符串。我不确定这些信息是否有帮助。
【问题讨论】:
-
Read cryptopp.com/wiki/Keys_and_Formats#BER_and_DER_Encoding
BERDecodePrivateKey需要一个非标准的数据结构。
标签: java c++ encryption rsa crypto++