ios - SWCrypt 公钥 VS PKCS8PEM key

标签 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 有什么区别?

生成的 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#1X509 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/

相关文章:

c# - 导入 RSA key 时 Aladdin eToken 失败

CryptoApi:导出没有私钥的证书?

ios - 将自定义词典保存为用户默认值

ios - 将 UIImageView 拖放到 subview 中 - Swift 3

ios - skmaps 通过更新 SKAnnotation 来解决巨大的内存泄漏

swift - 在 didBecomeActive() 中展开可选值时为零

php - 如何在 PHP 中加密长字符串?

ios - iphone UIBarButtonItem : setBackgroundImage - Stretched

ios - tableView(_ tableView : UITableView, cellForRowAt indexPath: IndexPath) 没有在 UITableViewController 子类中被调用

ios - 从运行时卸载/释放/移除 React Native View