7

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

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

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

我找到了一些教程,但我不明白我需要从SecKey参考中提取什么,而且我不知道如何将它转换为String.

4

1 回答 1

17

导出密钥(仅限 iOS 10)

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

有关可能支持 iOS < 10 的更长方法,请参阅https://stackoverflow.com/a/30662270/5276890https://stackoverflow.com/a/27935528/5276890

重新导入密钥

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 从证书生成公钥

另外:512 位生成速度很快,但毫无价值。一旦您对结果感到满意,请选择一个更长且更安全的值。

导入我生成和导出的密钥时,我得到了有效的结果,所以我认为它可以工作,但我没有尝试用它加密和解密。

于 2017-04-28T08:17:26.960 回答