Swift implementation of classic cryptographic key exchange method.
Swift implementation of classic cryptographic key exchange method.
Diffie-Hellman Key Exchange allow parties to jointly establish a secure private key without sharing it in any way (Forward secrecy) and then use it for a symmetric key cipher.
Both parties agree on a common component, which consists of two natural numbers p (modulus) and g (base). They can be completely random to make this work, but in order to make the process significantly harder to break, p should be a prime and g should be primitive root modulo of p. Check DHParameters.swift
for more info.
Then both parties generate random private keys and then compute public keys which they share with each other. Public keys are computed as follows publicKey = g^privateKey mod p
Afterward, both parties can compute common secret key using own private key and peer’s public key. They can do it using the following formula secretKey = peerPublicKey^ownPrivateKey mod p
Underlying math:
(g^a mod p)^b mod p = g^ab mod p
(g^b mod p)^a mod p = g^ba mod p
Now both parties can communicate using symmetric cryptography using a jointly established private key.
This protocol is considered secure (check disclaimer), because it’s relatively hard for eavesdroppers to compute a common secret key knowing only public keys if p is big enough.
Don’t use it in a production environment. Generated keys are very small (Int64) thus making them easily breakable.
Use already generated RFC primes, but even them may not be strong enough.
Greg (Grzegorz) Surma