From charlesreid1

Revision as of 03:50, 20 June 2026 by Admin (talk | contribs) (Rewrite as clean DH-only page following AES page format (via update-page on MediaWiki MCP Server))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

from Crypto import Random from Crypto.Util import number


def dh_generate_parameters(key_size=2048):

   """Generate DH group parameters (p, g)."""
   p = number.getPrime(key_size)
   g = 2
   return p, g


def dh_generate_keypair(p, g):

   """Generate private key a and public key A = g^a mod p."""
   a = int.from_bytes(Random.new().read(p.bit_length() // 8 + 8), 'big') % (p - 1)
   A = pow(g, a, p)
   return a, A


def dh_compute_shared(their_public, my_private, p):

   """Compute shared secret = (their_public)^my_private mod p."""
   return pow(their_public, my_private, p)


if __name__ == '__main__':

   print("=== Diffie-Hellman Key Exchange ===")
   # Step 1: Agree on public parameters
   p, g = dh_generate_parameters(2048)
   print("Prime p (first 80 hex): %s..." % hex(p)[:80])
   print("Generator g: %s" % g)
   # Step 2: Alice generates keypair
   alice_priv, alice_pub = dh_generate_keypair(p, g)
   print("Alice public key (first 80 hex): %s..." % hex(alice_pub)[:80])
   # Step 3: Bob generates keypair
   bob_priv, bob_pub = dh_generate_keypair(p, g)
   print("Bob   public key (first 80 hex): %s..." % hex(bob_pub)[:80])
   # Step 4: Each computes the shared secret
   s_alice = dh_compute_shared(bob_pub, alice_priv, p)
   s_bob   = dh_compute_shared(alice_pub, bob_priv, p)
   print("Shared secrets match: %s" % (s_alice == s_bob))
   print("Shared secret (first 80 hex): %s..." % hex(s_alice)[:80])

https://www.pycryptodome.org/src/protocol/dh



Red Links