Быстрое шифрование с использованием Security framework

Я пытался быстро зашифровать и расшифровать строку, используя обмен ключами Диффи Хеллмана и шифрование по эллиптической кривой. Но после обмена ключами я не могу восстановить закрытый ключ из переменной CFData shared1 / shared2 для дешифрования. Все, что я получаю, - это нулевое значение.

let attributes: [String: Any] = [kSecAttrKeySizeInBits as String: 256,
                                     kSecAttrKeyType as String: kSecAttrKeyTypeEC,
                                     kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false]]
    var error: Unmanaged<CFError>?
    if #available(iOS 10.0, *) {
        guard let privateKey1 = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {return}

        let publicKey1 = SecKeyCopyPublicKey(privateKey1)
        guard let privateKey2 = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {return}

        let publicKey2 = SecKeyCopyPublicKey(privateKey2)

        let dict: [String: Any] = [:]

        guard let shared1 = SecKeyCopyKeyExchangeResult(privateKey1, SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256, publicKey2!, dict as CFDictionary, &error) else {return}

        guard let shared2 = SecKeyCopyKeyExchangeResult(privateKey2, SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256, publicKey1!, dict as CFDictionary, &error) else {return}

        print(shared1==shared2)
        let options: [String: Any] = [kSecAttrKeyType as String: kSecAttrKeyTypeEC,
                                      kSecAttrKeyClass as String: kSecAttrKeyClassPrivate,
                                      kSecAttrKeySizeInBits as String : 256]

        guard let key = SecKeyCreateWithData(shared1 as CFData,
                                             options as CFDictionary,
                                             &error) else {return}
        print(key)


        let str = "Hello"
        let byteStr: [UInt8] = Array(str.utf8)
        let cfData = CFDataCreate(nil, byteStr, byteStr.count)


        guard let encrypted = SecKeyCreateEncryptedData(publicKey1!,
                                                        SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM,
                                                        cfData!,
                                                        &error) else {return}

        guard let decrypted = SecKeyCreateDecryptedData(key,
                                                        SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM,
                                                        encrypted,
                                                        &error) else {return}




        print(decrypted)

    } else {
        print("unsupported")
    }

person Dany    schedule 30.04.2018    source источник


Ответы (1)


SecKeyFromData Восстанавливает ключ из внешнего представления этого ключа. Значение, которое вы ему передаете, не является внешним представлением ключа, это общий секрет (CFData), всего несколько байтов. Вы должны получить ключ, используя некоторый KDF для общего секрета, затем вы можете использовать его для шифрования и дешифрования.

И ключи, которые вы используете для шифрования и дешифрования, неверны, вам нужно выбрать, хотите ли вы использовать асимметричное или симметричное шифрование.

SecKeyFromData: https://developer.apple.com/documentation/security/1643701-seckeycreatewithdata < / а>

person AdmiralAnk    schedule 13.07.2019
comment
как можно быстро создать KDF, используя sharedSecret? - person Sparksmith; 22.08.2019
comment
Я ограничен использованием только того, что доступно в системе безопасности :( - person Sparksmith; 23.08.2019
comment
Если вы хотите создать асимметричные ключи, вы можете использовать SecKeyCreateRandomKey, я не думаю, что вы не можете явно создать симметричный ключ в структуре безопасности, вы должны использовать SecKeyCreateEncryptedData, это создает симметричный ключ, использует его для шифрования ваших данных, а затем шифрует сам ключ предоставленным вами открытым ключом. Подробное объяснение здесь - person AdmiralAnk; 24.08.2019