从 NSData 检索 SecKey

Arr*_*ray 4 bluetooth ios swift seckeyref

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

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

你能帮忙吗?

小智 7

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

// 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
}
Run Code Online (Sandbox Code Playgroud)