iOS Swift Diff ie - Обмен ключами Хеллмана для шифрования и дешифрования сообщений? использование Secure Enclave - PullRequest
0 голосов
/ 08 апреля 2020

Как я могу использовать обмен ключами Diff ie -Hellman для шифрования и дешифрования сообщений?

Я могу генерировать общие ключи (как для Боба, так и для Алисы), но SecKeyCopyKeyExchangeResult возвращает меня данных ... как я могу заставить SecKey использовать с SecKeyCreateDecryptedData и SecKeyCreateEncryptedData?

Так что я думаю, что мне следует каким-то образом извлечь SecKey из общих данных, чтобы я мог сделать симметричное шифрование / дешифрование.

Код на данный момент:


let bob_shared_secret: NSData = generateSharedKey_ecdh(publicKey: alicePublicKey, privateKey: bobPrivateKey)!
let alice_shared_secret: NSData = generateSharedKey_ecdh(publicKey: bobPublicKey, privateKey: alicePrivateKey)!

print("equals? \(bob_shared_secret == alice_shared_secret)!") //true


let clearText = "Hello From Alice"
let algorithm: SecKeyAlgorithm = .eciesEncryptionCofactorVariableIVX963SHA256AESGCM

let cipherTextData: Data? = SecKeyCreateEncryptedData(alicePublicKey, algorithm,
                                                              clearTextData as CFData,
                                                              &error) as Data?

let clearTextData = SecKeyCreateDecryptedData(???? as SecKey, //what to put here??
                                                          algorithm,
                                                          cipherTextData as CFData,
                                                          &error) as Data?

private func generateSharedKey_ecdh(publicKey: SecKey, privateKey: SecKey) -> NSData?
    {
        var error: Unmanaged<CFError>?

        let keyPairAttr:[String : Any] = [
            kSecAttrKeySizeInBits as String: 256, //retro compatibility
            kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom, //Elliptic curve algorithm.
            kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false],
            kSecPublicKeyAttrs as String:[kSecAttrIsPermanent as String: false],
            SecKeyKeyExchangeParameter.requestedSize.rawValue as String: 256
        ]
        let algorithm:SecKeyAlgorithm = SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256

        let shared:CFData? = SecKeyCopyKeyExchangeResult(privateKey, algorithm, publicKey, keyPairAttr as CFDictionary, &error)

        return shared
    }

Генерация пары ключей ... пара ключей Это класс, который я создал, чтобы содержать ключи


class KeyPair {
    var publicKey: SecKey
    var privateKey: SecKey
    init(publicKey: SecKey, privateKey: SecKey) {
        self.publicKey = publicKey
        self.privateKey = privateKey
    }
}

private func generateKeyPair() -> KeyPair? {
        let attributes: [String: Any] = [kSecAttrKeySizeInBits as String: 256,
                                         kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
                                         kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false],
                                         kSecPublicKeyAttrs as String:[kSecAttrIsPermanent as String: false]]

        var error: Unmanaged<CFError>?

        if let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error),
            let publicKey = SecKeyCopyPublicKey(privateKey){
            return KeyPair(publicKey: publicKey, privateKey: privateKey)
        }

        return nil
    }

1 Ответ

0 голосов
/ 29 апреля 2020

SecKeyCreateEncryptedData и SecKeyCreateDecryptedData предназначены для асимметричного c шифрования (с использованием ECIES или RSA)

Для выполнения операции шифрования / дешифрования symetri c вам следует использовать обычное шифрование или его инкапсуляцию, например Crypto swift ( https://github.com/krzyzanowskim/CryptoSwift) и алгоритм AES

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...