Swift中如何将ECPublicKey(SecKey)转换为标准PEM格式字符串
ECPublicKey转标准PEM公钥格式解决方案
问题根因
你当前通过
SecKeyCopyExternalRepresentation获取到的是裸EC公钥原始字节,格式为0x04前缀 + 32字节x坐标 + 32字节y坐标共65字节,而标准PEM格式公钥包裹的是带ASN.1头的SubjectPublicKeyInfo(SPKI)结构,并非裸公钥数据,因此直接加头尾标识无法被正常解析。
完整实现代码(Swift,适用secp256r1曲线)
var error: Unmanaged<CFError>? guard let cfData = SecKeyCopyExternalRepresentation(publicKey, &error) else { // 自行处理错误逻辑 return } let rawPubKeyData = cfData as Data // secp256r1(prime256v1)曲线公钥对应的SPKI结构固定ASN.1前缀 let spkiHeader: [UInt8] = [0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00] // 拼接SPKI头与裸公钥数据 var spkiData = Data(spkiHeader) spkiData.append(rawPubKeyData) // 生成base64编码字符串 let base64Str = spkiData.base64EncodedString() // 拼接PEM头尾标识,如需严格符合规范可按64字符分段插入换行符 let pemPublicKey = """ -----BEGIN PUBLIC KEY----- \(base64Str) -----END PUBLIC KEY----- """
补充说明
- 上述代码中固定的SPKI头仅适配
secp256r1曲线,若使用其他ECC曲线需要替换为对应曲线的ASN.1头 - 多数公钥解析工具兼容无换行的base64内容,如需严格符合PEM标准,可自行对base64字符串做每64字符换行处理
内容的提问来源于stack exchange,提问作者UdayM
相关产品推荐
相关产品推荐

