我想使用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有什么区别?
生成密钥的样本:
MIIBCgKCAQEAuWwCZpNXJtT2spBsDwrQaTFGVAjicM341Qzg+1whtlj9J60c/7HYe6AcGHa8Dinkiuk7Whs1Wpa34aa223WQsa+kFSNwkC6oDUXhewan3VEsv1uedzHc8JPlTXnItJsP8cIETFgHpdKWk462hU09mVCTtQTix0BEb8snS96wERvKq957OeaGtFasfT/bQfY0mbDu6eEMqswmfX8j84kuTfwWtqt6mLMTJaDwnsGc5WY1zkau68IQ/CBiiLpZ5hSVMs2pPj3Ao0+wNhR5MlMgdcwrU62SHWcMJ5cYssFgWZyZSvO3n/yW43fE5a1i+9Tm2trveGIdMR4d/MoA79/8IQIDAQAB
生成的PEM密钥样本:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWwCZpNXJtT2spBsDwrQaTFGVAjicM341Qzg+1whtlj9J60c/7HYe6AcGHa8Dinkiuk7Whs1Wpa34aa223WQsa+kFSNwkC6oDUXhewan3VEsv1uedzHc8JPlTXnItJsP8cIETFgHpdKWk462hU09mVCTtQTix0BEb8snS96wERvKq957OeaGtFasfT/bQfY0mbDu6eEMqswmfX8j84kuTfwWtqt6mLMTJaDwnsGc5WY1zkau68IQ/CBiiLpZ5hSVMs2pPj3Ao0+wNhR5MlMgdcwrU62SHWcMJ5cYssFgWZyZSvO3n/yW43fE5a1i+9Tm2trveGIdMR4d/MoA79/8IQIDAQAB
如何发送生成的公钥简单的PEM密钥格式?
感谢。
答案 0 :(得分:2)
X509是公钥基础结构的标准,而不是编码格式。您可以在PEM
(base64),DER
(二进制)或XML
中对X509公钥进行编码。此外,公钥的二进制数据可以用PCKS#1
或X509 SubjectPublicKeyInfo
表示。
据我所知,PKCS#8是私钥的标准。见Reference。所以我猜PKCS #8: Private-Key Information Syntax Standard实际上是在使用X509 SubjectPublicKeyInfo
(也许我还没有读过一些RFC),这就是你的服务器正在等待的东西。
let publicKeyPEM = SwKeyConvert.PublicKey.derToPKCS8PEM(publicKey)
SubjectPublicKeyInfo
将公钥封装到添加标头的ASN.1结构中。如果使用publicKey.base64EncodedString
对公钥(DER)的原始数据进行编码,则不会添加该标头,并且您的服务器不知道如何管理它。