我想使用 SWCrypt 进行 RSA 加密和解密。我应该将解码后的公钥 base64 发送到服务器。但是当我尝试发送生成的公钥 base64 时,我无法在服务器端得到这个错误:
let (privateKey, publicKey) = try CC.RSA.generateKeyPair(2048)
let publicKeyBase64 = publicKey.base64EncodedString()
错误:java.security.InvalidKeyException:IOException:algid 解析错误,不是序列
但是当发送 PEMPublicKey 时得到成功响应。
let publicKeyPEM = SwKeyConvert.PublicKey.derToPKCS8PEM(publicKey)
publicKeyBase64 和 publicKeyPEM 有什么区别?
生成的 key 示例:
MIIBCgKCAQEAuWwCZpNXJtT2spBsDwrQaTFGVAjicM341Qzg+1whtlj9J60c/7HYe6AcGHa8Dinkiuk7Whs1Wpa34aa223WQsa+kFSNwkC6oDUXhewan3VEsv1uedzHc8JPlTXnItJsP8cIETFgHpdKWk462hU09mVCTtQTix0BEb8snS96wERvKq957OeaGtFasfT/bQfY0mbDu6eEMqswmfX8j84kuTfwWtqt6mLMTJaDwnsGc5WY1zkau68IQ/CBiiLpZ5hSVMs2pPj3Ao0+wNhR5MlMgdcwrU62SHWcMJ5cYssFgWZyZSvO3n/yW43fE5a1i+9Tm2trveGIdMR4d/MoA79/8IQIDAQAB
生成的 PEM key 示例:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWwCZpNXJtT2spBsDwrQaTFGVAjicM341Qzg+1whtlj9J60c/7HYe6AcGHa8Dinkiuk7Whs1Wpa34aa223WQsa+kFSNwkC6oDUXhewan3VEsv1uedzHc8JPlTXnItJsP8cIETFgHpdKWk462hU09mVCTtQTix0BEb8snS96wERvKq957OeaGtFasfT/bQfY0mbDu6eEMqswmfX8j84kuTfwWtqt6mLMTJaDwnsGc5WY1zkau68IQ/CBiiLpZ5hSVMs2pPj3Ao0+wNhR5MlMgdcwrU62SHWcMJ5cYssFgWZyZSvO3n/yW43fE5a1i+9Tm2trveGIdMR4d/MoA79/8IQIDAQAB
如何发送生成的 PEM key 格式的简单公钥?
谢谢。
最佳答案
X509 是公钥基础设施的标准,不是编码格式。您可以在 PEM
(base64)、DER
(二进制)或 XML
中对 X509 公钥进行编码。公钥的二进制数据也可以用 PCKS#1
或 X509 SubjectPublicKeyInfo
表示。
据我所知,PKCS#8 是私钥标准。参见 PKCS #8: Private-Key Information Syntax Standard .所以我猜 SWCrypt确实在使用 X509 SubjectPublicKeyInfo
(也许我还没有读过一些 RFC),这是您的服务器正在等待的。
let publicKeyPEM = SwKeyConvert.PublicKey.derToPKCS8PEM(publicKey)
SubjectPublicKeyInfo
将公钥封装到添加 header 的 ASN.1 结构中。如果您使用 publicKey.base64EncodedString
对公钥 (DER) 的原始数据进行编码,则不会添加该 header 并且您的服务器不知道如何管理它。
关于ios - SWCrypt 公钥 VS PKCS8PEM key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44900535/