微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 X.509 和 PKCS#1 RSA 公钥之间转换

如何解决在 X.509 和 PKCS#1 RSA 公钥之间转换

我正在使用 CryptoPP 生成 RSA 密钥,并对大量数据进行加密/解密。因此,我决定通过网络套接字从手机应用程序(目前使用 Flutter)以及已经存在的桌面客户端(桌面客户端工作,因为它们支持服务器使用的格式)输入数据。

我的问题是密钥的格式不同,我尝试的所有内容(特别是 simple_rsa)都无法与服务器兼容。据我所知,Flutter 仅支持 PKCS#1

我现在知道公钥是用 crypto++ wiki 中的 X.509 格式化的,并且通过使用在线工具 this 我发现密码类型(我猜是填充?) 是 OAEP with SHA-1

这表明两种密钥类型都使用 ASN.1

进行编码

作为参考,服务器代码this非常相似,但使用的密钥大小为4096

////////////////////////////////////////////////
// Generate keys
AutoSeededRandomPool rng;

InvertibleRSAFunction parameters;
parameters.GeneraterandomWithKeySize( rng,1536 );

RSA::PrivateKey privateKey( parameters );
RSA::PublicKey publicKey( parameters );

并通过以 base64 对数据进行编码将密钥写入 .pem 文件

std::string base64 = macaron::Base64::Encode(pubKeyString);
std::string base64LineLength;
int i = 0;
while (i < base64.size()) {
     if (i % 64 == 0 && i)
          base64LineLength.push_back('\n');
     base64LineLength.push_back(base64[i]);
     i++;
}
base64LineLength = "-----BEGIN PUBLIC KEY-----\n" + base64LineLength + "\n-----END PUBLIC KEY-----\n";
std::ofstream pubkeyOut("secure_chat_rsa.pub");
pubkeyOut << base64LineLength;
pubkeyOut.close();

此外,这是一个带有格式 (X.509) 的公钥示例

-----BEGIN PUBLIC KEY-----
MIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAmQlXbYS1I+B4AUXwU/ua
KgwdrUzYRwXPaR6435DAguDGW+zTeekDgP55lg9Lqn32UW+T/5PIgYQ2HpA/gfYU
IMvrLAhSSaXSEFzIzdwgFgo3IMZHdhcx/xP/+pmDTrflhmba/7QEOE/bC2hFzQCh
2Zd1DJbItIR64uyyi1Z0B6bFlLyDA2E+lctBLhuHSyYSqPrVUqYTRdptLNk8/vsN
HdWKrYq7H8n4QKQefspD5zU3SJdUumOIusqzXeMe70mPds+Qe9u4Ti5Ca7guZCN4
knxUF/kJH7Y3dBh7409r2v/bjGEznFpY1cmP1f0EFYTQU1BirbNiwqnAjhy9fT2M
quSlpmwo7V0YbZDI/KBcLDxTY64oO6XMz6DHkdmpOluALWQAJZFJ7iHntsLp1GRB
DtLaidCr9EI+pN7cfwsSYLRHtEmUZoiz30RZra5c5+aE4sg24c/PJ5nVe9GDOaQs
dhl3+sc2r9LTEK9pCSO5cWdbxSRvKNrevElr2+8ORUQL1cRsCmL8ri4eYwrwukBn
HFJc1pZFD8i5sFjnJxEIKzoIa+eGVgqEwkwxKvNuUUyH3tJD9YJVlhs1G68VlxOf
RSk+LZGhwSMZs+PbfuxmPQZyapT5TqRJ2JJ7f9HErIq5f8WjBrzcqy63rygy33Hw
M94iQLwuTM3X99Z4FnyTsTECARE=
-----END PUBLIC KEY-----

编辑: 我曾尝试将密钥通过 ANS.1 解码器,并从中提取位字符串,然后将其通过 base64 编码器给出:

MIICCAKCAgEAmQlXbYS1I+B4AUXwU/uaKgwdrUzYRwXPaR6435DAguDGW+zTeekDgP55lg9Lqn32UW+T/5PIgYQ2HpA/gfYUIMvrLAhSSaXSEFzIzdwgFgo3IMZHdhcx/xP/+pmDTrflhmba/7QEOE/bC2hFzQCh2Zd1DJbItIR64uyyi1Z0B6bFlLyDA2E+lctBLhuHSyYSqPrVUqYTRdptLNk8/vsNHdWKrYq7H8n4QKQefspD5zU3SJdUumOIusqzXeMe70mPds+Qe9u4Ti5Ca7guZCN4knxUF/kJH7Y3dBh7409r2v/bjGEznFpY1cmP1f0EFYTQU1BirbNiwqnAjhy9fT2MquSlpmwo7V0YbZDI/KBcLDxTY64oO6XMz6DHkdmpOluALWQAJZFJ7iHntsLp1GRBDtLaidCr9EI+pN7cfwsSYLRHtEmUZoiz30RZra5c5+aE4sg24c/PJ5nVe9GDOaQsdhl3+sc2r9LTEK9pCSO5cWdbxSRvKNrevElr2+8ORUQL1cRsCmL8ri4eYwrwukBnHFJc1pZFD8i5sFjnJxEIKzoIa+eGVgqEwkwxKvNuUUyH3tJD9YJVlhs1G68VlxOfRSk+LZGhwSMZs+PbfuxmPQZyapT5TqRJ2JJ7f9HErIq5f8WjBrzcqy63rygy33HwM94iQLwuTM3X99Z4FnyTsTECARE=

但是,这不是有效的 RSA 密钥。 (试图用它加密)

我有 4 个主要问题:

  • 有没有办法将 X.509 格式转换为 PKCS#1,反之亦然
  • 如果转换,输出是否兼容。当服务器对数据进行编码时,如果密钥被转换,客户端是否能够解密它?
  • Flutter 是否可以使用 X.509 格式的键?
  • 如果这仅仅是由于 ANS.1,您将如何对密码或密钥进行编码?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。