Шифрование данных с использованием шифрования эллиптической кривой в ios / swift

Я пытался зашифровать строку с помощью шифрования эллиптической кривой с использованием библиотеки Security swift, и я получаю сообщение об ошибке в строке с SecKeyCreateEncryptedData(...):

Поток 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0).

Я предполагаю, что длина и формат данных не соответствуют выбранному алгоритму, но я не могу найти никакой информации об этом в документации.

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 str = "Hello"
    let byteStr: [UInt8] = Array(str.utf8)
    let cfData = CFDataCreate(nil, byteStr, byteStr.count)

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

    guard let decrypted = SecKeyCreateDecryptedData(shared2 as! SecKey, SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM, encrypted, &error) else {return}


    print(decrypted)

} else {
    print("unsupported")
}

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


Ответы (1)


С линией

SecKeyCreateEncryptedData(shared1 as! SecKey, SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM, cfData!, &error)

вы принудительно преобразуете shared1 в SecKey тип. Принудительное приведение (обычно) - плохая идея, в вашем случае это приводит к сбою, потому что shared1 не относится к типу SecKey, а к типу CFData? - потому что это то, что возвращает SecKeyCopyKeyExchangeResult. Из документации:

func SecKeyCopyKeyExchangeResult(_ privateKey: SecKey, 
                           _ algorithm: SecKeyAlgorithm, 
                           _ publicKey: SecKey, 
                           _ parameters: CFDictionary, 
                           _ error: UnsafeMutablePointer<Unmanaged<CFError>?>?) -> CFData?

Вы можете ясно видеть, что эта функция возвращает CFData?

person mag_zbc    schedule 25.04.2018
comment
Ты прав. Спасибо. Но я пытался получить ключ для шифрования и дешифрования данных из этой переменной shared1 / shared2 с помощью этой функции: SecKeyCreateData (shared1, атрибуты как CFDictionary и ошибка). Но взамен я получаю нулевое значение. Что мне делать, чтобы получить этот ключ? - person Dany; 25.04.2018
comment
Вы выяснили, как использовать sharedKey для шифрования / дешифрования? - person Sparksmith; 22.08.2019
comment
@Dany то же самое для меня ... это всегда ноль ... как вы решили? - person Fabiosoft; 08.04.2020