Let's say Alice and Bob want to exchange a secret over an insecure channel. In other words, anyone can read the messages they send, but the goal is to ensure that only Alice and Bob can calculate the secret key.
Diffie-Hellman key exchange provides a solution to this seemingly impossible task. Since code may be easier to understand than a detailed explanation, I'll provide it first:
import Crypto.Util.number as cunimport Crypto.Random.random as crrclass DiffieHellman:def __init__(self, p: int):self.p = pself.g = 5self.private_key = crr.randrange(2, p-1)def public_key(self) -> int:return pow(self.g, self.private_key, self.p)def shared_key(self, other_public_key: int) -> int:return pow(other_public_key, self.private_key, self.p)p = cun.getPrime(512)alice = DiffieHellman(p)bob = DiffieHellman(p)shared_key = bob.shared_key(alice.public_key())assert shared_key == alice.shared_key(bob.public_key())
Here's a brief explanation of the code:
We choose a prime and a generator
Alice picks a private key
Bob picks a private key
Alice's public key is
Bob's public key is
Their shared key is
This is because given and , it should be infeasible to calculate . If this sounds familiar, that's because it's the Discrete Log Problem.
The original paper can be found here. It uses the group of integers modulo a prime to perform the key exchange. In practice however, any group with a hard discrete log problem can be used.