|
1 |
| -import random |
| 1 | +""" |
| 2 | +https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange |
| 3 | +""" |
2 | 4 |
|
3 |
| -# RFC 3526 - More Modular Exponential (MODP) Diffie-Hellman groups for |
4 |
| -# Internet Key Exchange (IKE) https://tools.ietf.org/html/rfc3526 |
| 5 | +import random |
5 | 6 |
|
6 |
| -PRIMES = { |
| 7 | +""" |
| 8 | +RFC 3526 - More Modular Exponential (MODP) Diffie-Hellman groups for |
| 9 | +Internet Key Exchange (IKE) https://tools.ietf.org/html/rfc3526 |
| 10 | +""" |
| 11 | +GROUPS = { |
7 | 12 | # 1536-bit
|
8 | 13 | 5: {
|
9 | 14 | "prime": int(
|
|
179 | 184 |
|
180 | 185 | class DiffieHellman:
|
181 | 186 | """
|
182 |
| - Class to represent the Diffie-Hellman key exchange protocol |
| 187 | + Class to represent one party in the Diffie-Hellman key exchange protocol |
183 | 188 |
|
| 189 | + Current minimum recommendation is 2048 bit |
| 190 | + >>> group = GROUPS[14] |
| 191 | + >>> prime, generator = group['prime'], group['generator'] |
| 192 | + >>> alice = DiffieHellman(prime, generator) |
184 | 193 |
|
185 |
| - >>> alice = DiffieHellman() |
186 |
| - >>> bob = DiffieHellman() |
| 194 | + Both parties should agree on the same public parameters |
| 195 | + >>> bob = DiffieHellman(alice.prime, alice.generator) |
187 | 196 |
|
188 |
| - >>> alice_public = alice.public_key |
189 |
| - >>> bob_public = bob.public_key |
| 197 | + Alice sends Bob its public key, |
| 198 | + >>> bob_shared = bob.generate_shared_key(alice.public_key) |
190 | 199 |
|
191 |
| - Generating shared key using the DH object |
192 |
| - >>> alice_shared = alice.generate_shared_key(bob_public) |
193 |
| - >>> bob_shared = bob.generate_shared_key(alice_public) |
194 |
| - >>> assert alice_shared == bob_shared |
195 |
| - """ |
| 200 | + and the same vice versa: |
| 201 | + >>> alice_shared = alice.generate_shared_key(bob.public_key) |
196 | 202 |
|
197 |
| - # Current minimum recommendation is 2048 bit (group 14) |
198 |
| - def __init__(self, group: int = 14) -> None: |
199 |
| - if group not in PRIMES: |
200 |
| - raise ValueError("Unsupported Group") |
201 |
| - self.prime = PRIMES[group]["prime"] |
202 |
| - self.generator = PRIMES[group]["generator"] |
| 203 | + >>> alice_shared == bob_shared |
| 204 | + True |
| 205 | + """ |
203 | 206 |
|
| 207 | + def __init__(self, prime: int, generator: int) -> None: |
| 208 | + self.prime = prime |
| 209 | + self.generator = generator |
204 | 210 | self.__private_key = random.getrandbits(256)
|
205 | 211 |
|
206 | 212 | @property
|
|
0 commit comments