Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从NSData中检索SecKey_Ios_Swift_Bluetooth_Seckeyref - Fatal编程技术网

Ios 从NSData中检索SecKey

Ios 从NSData中检索SecKey,ios,swift,bluetooth,seckeyref,Ios,Swift,Bluetooth,Seckeyref,从NSData创建SecKey时遇到问题。基本上,我的客户机-服务器通信基于使用私钥创建的签名,并在服务器上使用公钥进行验证 我正在两个设备之间实现会话传输,为了继续通信,我还需要传输这些密钥。我正在将SecKey转换为NSData并通过蓝牙发送,但另一方面,我无法将NSData转换为SecKey以使用加密 你能帮忙吗?我用什么来成功 func obtainKeyData(tag: String) -> NSData? { var keyRef: AnyObject? le

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

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


你能帮忙吗?

我用什么来成功

func obtainKeyData(tag: String) -> NSData? {
    var keyRef: AnyObject?
    let query: Dictionary<String, AnyObject> = [
        String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
        String(kSecReturnData): kCFBooleanTrue as CFBoolean,
        String(kSecClass): kSecClassKey as CFStringRef,
        String(kSecAttrApplicationTag): tag as CFStringRef,
        ]

    let result: NSData?

    switch SecItemCopyMatching(query, &keyRef) {
    case noErr:
        result = keyRef as? NSData
    default:
        result = nil
    }

    return result
}

func insertPublicKey(publicTag: String, data: NSData) -> SecKeyRef? {
    let query: Dictionary<String, AnyObject> = [
        String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
        String(kSecClass): kSecClassKey as CFStringRef,
        String(kSecAttrApplicationTag): publicTag as CFStringRef,
        String(kSecValueData): data as CFDataRef,
        String(kSecReturnPersistentRef): true as CFBooleanRef]

    var persistentRef: AnyObject?
    let status = SecItemAdd(query, &persistentRef)

    if status != noErr && status != errSecDuplicateItem {
        return nil
    }

    return obtainKey(publicTag)
}
func obtainKey(tag: String) -> SecKey? {
    var keyRef: AnyObject?
    let query: Dictionary<String, AnyObject> = [
        String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
        String(kSecReturnRef): kCFBooleanTrue as CFBoolean,
        String(kSecClass): kSecClassKey as CFStringRef,
        String(kSecAttrApplicationTag): tag as CFStringRef,
        ]

    let status = SecItemCopyMatching(query, &keyRef)

    switch status {
    case noErr:
        if let ref = keyRef {
            return (ref as! SecKeyRef)
        }
    default:
        break
    }

    return nil
}
func-obtainKeyData(标记:String)->NSData?{
var-keyRef:AnyObject?
让查询:字典=[
字符串(kSecAttrKeyType):kSecAttrKeyTypeRSA,
字符串(kSecReturnData):kCFBooleanTrue为CFBoolean,
字符串(kSecClass):kSecClassKey作为CFStringRef,
字符串(kSecAttrApplicationTag):标记为CFStringRef,
]
让结果:NSData?
开关SecItemCopyMatching(查询和keyRef){
案件编号:
结果=keyRef as?NSData
违约:
结果=零
}
返回结果
}
func insertPublicKey(publicTag:String,data:NSData)->SecKeyRef?{
让查询:字典=[
字符串(kSecAttrKeyType):kSecAttrKeyTypeRSA,
字符串(kSecClass):kSecClassKey作为CFStringRef,
字符串(kSecAttrApplicationTag):publicTag作为CFStringRef,
字符串(kSecValueData):数据为CFDataRef,
字符串(kSecReturnPersistentRef):作为CFBooleanRef为真]
var persistentRef:任何对象?
let status=SecItemAdd(查询和持久化)
如果状态!=noErr&&status!=errSecDuplicateItem{
归零
}
返回获取密钥(publicTag)
}
func获取密钥(标记:字符串)->SecKey?{
var-keyRef:AnyObject?
让查询:字典=[
字符串(kSecAttrKeyType):kSecAttrKeyTypeRSA,
字符串(kSecReturnRef):kCFBooleanTrue为CFBoolean,
字符串(kSecClass):kSecClassKey作为CFStringRef,
字符串(kSecAttrApplicationTag):标记为CFStringRef,
]
let status=SecItemCopyMatching(查询和keyRef)
开关状态{
案件编号:
如果let ref=keyRef{
返回(引用为!SecKeyRef)
}
违约:
打破
}
归零
}

没有简单的方法可以传输密钥对的私有部分(这是可能的,但要尽量避免)

从iOS 10开始,您可以使用以下代码:

let attributes: [String:Any] = [
            kSecAttrKeyClass as String: kSecAttrKeyClassPublic,
            kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
            kSecAttrKeySizeInBits as String: blockSize,
            ]
secKey = SecKeyCreateWithData(secKeyData as CFData, attributes as CFDictionary, nil)
更完整的示例(swift 4,iOS 10+)-假设您有一个Base64编码字符串。请注意,连接的另一端还需要使用相同的格式创建密钥有效负载(即RSA-PKCS#1,还需要验证密钥大小)。此函数处理公钥或私钥(为简洁起见,省略了安全警告)


你能粘贴你的代码吗?@AmitKalghatgi你想粘贴哪部分?我有接收“NSData?”的函数,应该返回SecKey(或SecKeyRef)是的,我也有这部分代码,但这里的问题是它严格绑定到标签,可能是自动生成的。我可以对私钥的标签做同样的操作吗?或者我需要用另一种方式来做?不,用私钥这是不可用的。原因是,私钥应该是私有的,因此通常不容易转移到其他设备。请先尝试更改程序流。@Array。。更具体地说,SecItemAdd将使用私钥失败。。。(iOS)
// 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
}