【问题标题】:Convert ECPublicKey(SecKey) to PEM String in swift快速将 ECPublicKey(SecKey) 转换为 PEM 字符串
【发布时间】:2021-09-20 18:02:05
【问题描述】:

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

"-----开始公开 KEY-----MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEo0WcFrFClvBE8iZ1Gdlj+mTgZoJWMNE3kDKTfRny2iaguwuSYxo+jCnXqzkR+kyFK9CR3D+pypD1sGb1BnfWAA==-----END 公钥-----"

  1. 生成的 ECPublicKey 具有密钥类型“ECC/ECDSA/spec256r1”。下面是印刷品

  1. 据我所知,PEM 格式只不过是 base64 编码的字符串以及页眉和页脚。尝试了下面的代码,但没有成功
var error:Unmanaged<CFError>?

guard let cfdata = SecKeyCopyExternalRepresentation(publicKey, &error)
else { return }

let data:Data = cfdata as Data

let b64String = data.base64EncodedString()

在这里感谢任何帮助

【问题讨论】:

  • SecKeyCopyExternalRepresentation 为您提供原始密钥(数字)。您必须将其转换为 ASN.1 格式(即,在前缀前面加上有关格式的信息)。然后只需 base64 编码并添加 PEM 页眉/页脚

标签: ios swift pem seckeyref


【解决方案1】:

首先转换为 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2015-06-19
    • 2017-03-16
    • 2016-07-29
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多