Swift 3 将 SecKey 导出到字符串

Swift 3 export SecKey to String

我正在使用 swift 开发一个 iOS 应用程序 3.

我需要将 SecKey(这是用户 RSA 公钥引用)导出到字符串(例如 base64),以便通过生成的 QRCode 共享它。

它也必须以另一种方式工作,因为扫描 QRCode 的其他用户将能够从 QRCode 中提取的字符串重建 SecKey 引用。

我找到的教程很少,但我不明白我需要从 SecKey 参考中提取什么,而且我不知道如何将其转换为 String

导出密钥(iOS 仅限 10)

var error:Unmanaged<CFError>?
if let cfdata = SecKeyCopyExternalRepresentation(publicKey!, &error) {
   let data:Data = cfdata as Data
   let b64Key = data.base64EncodedString()
}

请参阅 and 了解可能支持 iOS < 10 的更长方法。

重新导入密钥

guard let data2 = Data.init(base64Encoded: b64Key) else {
   return
}

let keyDict:[NSObject:NSObject] = [
   kSecAttrKeyType: kSecAttrKeyTypeRSA,
   kSecAttrKeyClass: kSecAttrKeyClassPublic,
   kSecAttrKeySizeInBits: NSNumber(value: 512),
   kSecReturnPersistentRef: true as NSObject
]

guard let publicKey = SecKeyCreateWithData(data2 as CFData, keyDict as CFDictionary, nil) else {
    return
}

注意:这会生成 base64 密钥而不是证书。许多在线代码示例处理如何使用 SecCertificateCreateWithData

从证书生成 public 密钥

另外:512 位生成速度快但毫无价值。对结果满意后,请选择更长且安全的值。

我在导入我生成和导出的密钥时得到了有效结果,所以我假设它有效,但我没有尝试用它加密和解密。