ios - 快速将 ECPublicKey(SecKey) 转换为 PEM 字符串

标签 ios swift pem seckeyref

我想将 ECPublicKey 转换为 PEM 格式,如下所示

"-----BEGIN PUBLIC KEY-----MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEo0WcFrFClvBE8iZ1Gdlj+mTgZoJWMNE3kDKTfRny2iaguwuSYxo+jCnXqzkR+kyFK9CR3D+pypD1sGb1BnfWAA==-----END PUBLIC KEY-----"

  1. 生成的 ECPublicKey, key 类型为“ECC/ECDSA/spec256r1”。下面是打印内容

<SecKeyRef curve type: kSecECCurveSecp256r1, algorithm id: 3, key type: ECPublicKey, version: 4, block size: 256 bits, y: B6EEBB3791933312E10BD7C3D65C950AB7E1C325BCDB57A8663EB7B1E29BFA77, x: 1D41FDAD2137316D415B117227BCC465566E56A54E7B2B9B3A4B66C15A067611, addr: 0x7f818850f6d0>

  • 据我所知,PEM 格式只不过是带有页眉和页脚的 Base64 编码字符串。尝试了下面的代码,但没有成功
  • var error:Unmanaged<CFError>?
    
    guard let cfdata = SecKeyCopyExternalRepresentation(publicKey, &error)
    else { return }
    
    let data:Data = cfdata as Data
    
    let b64String = data.base64EncodedString()
    

    感谢此处的任何帮助

    最佳答案

    首先转换为 ASN.1 格式: (请参阅 ASN.1 Decoder 中的解码示例)

    let publicKeyData: CFData = ...
    let ecHeader: [UInt8] = [
        /* sequence          */ 0x30, 0x59,
        /* |-> sequence      */ 0x30, 0x13,
        /* |---> ecPublicKey */ 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, // (ANSI X9.62 public key type)
        /* |---> prime256v1  */ 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, // (ANSI X9.62 named elliptic curve)
        /* |-> bit headers   */ 0x07, 0x03, 0x42, 0x00
    ]
    
    var asn1 = Data()
    asn1.append(Data(ecHeader))
    asn1.append(publicKeyData as Data)
    

    然后进行 Base64 编码并添加 PEM 页眉和页脚:

    let encoded = asn1.base64EncodedString(options: .lineLength64Characters)
    let pemString = "-----BEGIN PUBLIC KEY-----\r\n\(encoded)\r\n-----END PUBLIC KEY-----\r\n"
    

    关于ios - 快速将 ECPublicKey(SecKey) 转换为 PEM 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69258967/

    相关文章:

    ios - 如何清除 NSMutableAttributedString 中的属性?

    ubuntu - 使用 .pem 从 AWS Instance SSH 到 AWS Instance 要求输入密码

    python-3.x - 读取 pem 证书期间 python 3.6 出现 x509 错误

    ios - 是否可以从我的应用程序启动 Apple Pay NFC?

    ios - 传输高分和数据

    swift - 我如何在 UIImageView 上放置摇动动画

    appDelegate 中的 Swift 2 迁移 saveContext()

    security - 存储加密的 PEM block 安全吗?

    ios - 苹果 TestFlight : Is it allowed to upload 2 beta apps for an A/B test?

    ios - iOS 和 Swift 中 UTC 的登机时间和当前时间之间的差异