swift - 获取 SecKey 的字符串表示形式

标签 swift public-key-encryption

编辑 添加了所需请求的屏幕截图。

我正在尝试使用 Swift 4 制作一个 MacOs 应用程序。此应用程序与需要 RSA 加密的 API 进行通信。

Google 没有给出可以解释如何做到这一点的结果。 Apple 关于此主题的文档非常广泛 ( https://developer.apple.com/library/content/documentation/Security/Conceptual/CertKeyTrustProgGuide/KeyRead.html#//apple_ref/doc/uid/TP40001358-CH222-SW2 ),但仍然不是我需要的。

函数 SecKeyCopyExternalRepresentation 给出了一个数据对象 不能转换为字符串。文档说这是 PCKS #1 响应,但我无法解决。

我已经尝试了很多东西,包括下面的,但我无法让它工作。

func externalRepresentation(_ key: SecKey) -> String? {
    var error: Unmanaged<CFError>?

    guard let data = SecKeyCopyExternalRepresentation(key, &error) as Data? else {
        return nil
    }

    return data.base64EncodedString()
}

请求需要如下: Request

这在 Swift 中甚至可能吗?

最佳答案

将二进制 blob(如证书或 RSA key 编码为字符串)的常规方法是使用 base64编码。您可以使用函数 base64EncodedString(options:) 轻松地将 Data 转换为 base64。 .即

let myString = myData.base64EncodedString()

很难说这是否正是您对该应用程序所需要的,因为您的问题没有提供太多上下文。

查看您的屏幕截图以及 base64 编码的字符串,您需要一个页眉和页脚。数据结构中的大多数明显随机字母都是 base64 字符串(JSON 转换已使用 \n 对换行符进行编码,其他内容已将反斜杠加倍)。因此,您的最后一步是在字符串前加上 -----BEGIN PUBLIC KEY----- 和一个新行,然后追加一个新行和 -----END公钥-----

还有一件事:您可以使用 Data.init?((base64Encoded base64String:,options:) 很容易地从 base64 字符串中取回原始数据。 .即

guard let myDataCopy = Data(base64Encoded: myString)
else { fatalError("the string was not really base64") }

关于swift - 获取 SecKey 的字符串表示形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46890700/

相关文章:

Swift 游戏音量/扬声器图标

postgresql - 有没有办法在 Postgres 中验证签名的摘要?

c# - 如何在 C# 中从 ECDsa 获取公钥

arrays - 如何让你的tableView在你的tableView顶部显示新的或更新的元素 PT.2

ios - 在打开/加载之前加载/刷新 WKWebView

swift - 为什么我无法从 Parse 检索对象并将其存储在数组中?

wix - 如何找到 WiX RemotePayload 的 CertificatePublicKey 哈希

android - 字符串比较加密和解密android中的 key

ruby - 创建一个安全的、基于 Web 的密码管理系统,能够在用户之间共享数据

ios - Swift:自动换行不起作用?即使设置