SWCrypt public 密钥 VS PKCS8PEM 密钥

SWCrypt public key VS PKCS8PEM Key

我想使用 SWCrypt 进行 RSA 加密和解密。我应该将我的 public 密钥 base64 解码发送到服务器。但是当我尝试发送生成的 public 密钥 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

如何发送生成的 public 简单 PEM 密钥格式的密钥?

谢谢。

X509 是 Public 关键基础设施的标准,而不是编码格式。您可以在 PEM(base64)、DER(二进制)或 XML 中对 X509 public 密钥进行编码。 public 键的二进制数据也可以用 PCKS#1X509 SubjectPublicKeyInfo 表示。

据我所知,PKCS#8 是私钥标准。请参阅 PKCS #8: Private-Key Information Syntax Standard. So I guess SWCrypt 确实在使用 X509 SubjectPublicKeyInfo(也许我还没有阅读一些 RFC),这正是您的服务器正在等待的。

let publicKeyPEM = SwKeyConvert.PublicKey.derToPKCS8PEM(publicKey)

SubjectPublicKeyInfo 将 public 密钥封装到一个 ASN.1 结构中,添加一个 header。如果您使用 publicKey.base64EncodedString 对 public 密钥 (DER) 的原始数据进行编码,则不会添加 header 并且您的服务器不知道如何管理它。