Skip to content

Diffie-Hellman key exchange to encrypt and decrypt messages? #1

Description

@fabiosoft

How can i use the Diffie-Hellman key exchange to encrypt and decrypt messages?

I'am able to generate the shared keys (for both bob and alice) but SecKeyCopyKeyExchangeResult returns me a Data...how can i get SecKey to use with SecKeyCreateDecryptedData and SecKeyCreateEncryptedData ?

So i think i should extract the SecKey somehow from the shared data so i can make symettrical encryption/decryption.

The code so far is:

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 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
    }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions