ios - 从 NSData 中检索 SecKey

标签 ios swift bluetooth seckeyref

我在 NSData 创建 SecKey 时遇到问题。基本上,我的客户端-服务器通信基于使用私钥创建的签名并使用公钥在服务器上进行验证。

我正在两个设备之间实现 session 传输,为了继续通信,我还需要传输这些 key 。我正在将 SecKey 转换为 NSData 并通过蓝牙发送,但另一方面我无法将 NSData to SecKey 转换回使用加密。

你能帮忙吗?

最佳答案

更完整的例子(swift 4,iOS 10+)——假设你有一个 Base64 编码的字符串。请注意,连接的另一端也需要使用相同的格式创建 key 有效负载(即 RSA - PKCS #1,也验证 key 大小)。此函数处理公钥或私钥(为简洁起见,省略了安全警告)。

// Extract secKey from encoded string - defaults to extracting public keys
func decodeSecKeyFromBase64(encodedKey: String, isPrivate: Bool = false) -> SecKey? {
    var keyClass = kSecAttrKeyClassPublic
    if isPrivate {
        keyClass = kSecAttrKeyClassPrivate
    }
    let attributes: [String:Any] =
    [
        kSecAttrKeyClass as String: keyClass,
        kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
        kSecAttrKeySizeInBits as String: 2048,
    ]

    guard let secKeyData = Data.init(base64Encoded: encodedKey) else {
        print("Error: invalid encodedKey, cannot extract data")
        return nil
    }
    guard let secKey = SecKeyCreateWithData(secKeyData as CFData, attributes as CFDictionary, nil) else {
        print("Error: Problem in SecKeyCreateWithData()")
        return nil
    }

    return secKey
}

关于ios - 从 NSData 中检索 SecKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38097824/

相关文章:

Android 蓝牙聊天示例 : bluetooth connection lost upon screen rotation

ios - 如何设置可能有或没有文字的标签?

ios - 应用程序更新未显示在 'App Store Updates' 下

ios - 如何在 iPhone 6 上安装旧版本的 TestFlight

swift - RealmSwift 保存了多少数据?

ios - 从 OSX 应用程序连接到蓝牙 LE 设备的外围设备

ios - 在单个 View 应用程序中使用 sprite kit

xcode - 如何在两个 View 布局之间切换? ( swift )

ios - 隐藏和显示状态栏时状态栏闪烁

java - 如何通过蓝牙一起读取所有字节?