SWCrypt公钥VS PKCS8PEM密钥

时间:2017-07-04 08:16:04

标签: ios swift rsa

我想使用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密钥格式?

感谢。

1 个答案:

答案 0 :(得分:2)

X509是公钥基础结构的标准,而不是编码格式。您可以在PEM(base64),DER(二进制)或XML中对X509公钥进行编码。此外,公钥的二进制数据可以用PCKS#1X509 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)的原始数据进行编码,则不会添加该标头,并且您的服务器不知道如何管理它。