<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://charlesreid1.com/w/index.php?action=history&amp;feed=atom&amp;title=Diffie_Hellman_Key_Exchange</id>
	<title>Diffie Hellman Key Exchange - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://charlesreid1.com/w/index.php?action=history&amp;feed=atom&amp;title=Diffie_Hellman_Key_Exchange"/>
	<link rel="alternate" type="text/html" href="https://charlesreid1.com/w/index.php?title=Diffie_Hellman_Key_Exchange&amp;action=history"/>
	<updated>2026-06-20T09:49:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.12</generator>
	<entry>
		<id>https://charlesreid1.com/w/index.php?title=Diffie_Hellman_Key_Exchange&amp;diff=30706&amp;oldid=prev</id>
		<title>Admin: Rewrite as clean DH-only page following AES page format (via update-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://charlesreid1.com/w/index.php?title=Diffie_Hellman_Key_Exchange&amp;diff=30706&amp;oldid=prev"/>
		<updated>2026-06-20T03:50:11Z</updated>

		<summary type="html">&lt;p&gt;Rewrite as clean DH-only page following AES page format (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;a href=&quot;https://charlesreid1.com/w/index.php?title=Diffie_Hellman_Key_Exchange&amp;amp;diff=30706&amp;amp;oldid=30703&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://charlesreid1.com/w/index.php?title=Diffie_Hellman_Key_Exchange&amp;diff=30703&amp;oldid=prev</id>
		<title>Admin: Create Diffie Hellman Key Exchange page with DH + RSA practical implementations (via create-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://charlesreid1.com/w/index.php?title=Diffie_Hellman_Key_Exchange&amp;diff=30703&amp;oldid=prev"/>
		<updated>2026-06-20T03:48:46Z</updated>

		<summary type="html">&lt;p&gt;Create Diffie Hellman Key Exchange page with DH + RSA practical implementations (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;![CDATA[from Crypto.PublicKey import RSA, DSA&lt;br /&gt;
from Crypto.Cipher import PKCS1_OAEP&lt;br /&gt;
from Crypto.Signature import PKCS1_v1_5&lt;br /&gt;
from Crypto.Hash import SHA256&lt;br /&gt;
from Crypto import Random&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --- RSA Key Generation ---&lt;br /&gt;
&lt;br /&gt;
def rsa_generate_keys(key_size=2048):&lt;br /&gt;
    key = RSA.generate(key_size)&lt;br /&gt;
    private_key = key.export_key()&lt;br /&gt;
    public_key = key.publickey().export_key()&lt;br /&gt;
    return private_key, public_key&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --- RSA Encryption / Decryption ---&lt;br /&gt;
&lt;br /&gt;
def rsa_encrypt(plaintext, public_key_pem):&lt;br /&gt;
    key = RSA.import_key(public_key_pem)&lt;br /&gt;
    cipher = PKCS1_OAEP.new(key)&lt;br /&gt;
    return cipher.encrypt(plaintext.encode(&amp;#039;utf-8&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rsa_decrypt(ciphertext, private_key_pem):&lt;br /&gt;
    key = RSA.import_key(private_key_pem)&lt;br /&gt;
    cipher = PKCS1_OAEP.new(key)&lt;br /&gt;
    return cipher.decrypt(ciphertext).decode(&amp;#039;utf-8&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --- RSA Signing / Verification ---&lt;br /&gt;
&lt;br /&gt;
def rsa_sign(message, private_key_pem):&lt;br /&gt;
    key = RSA.import_key(private_key_pem)&lt;br /&gt;
    h = SHA256.new(message.encode(&amp;#039;utf-8&amp;#039;))&lt;br /&gt;
    signer = PKCS1_v1_5.new(key)&lt;br /&gt;
    return signer.sign(h)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rsa_verify(message, signature, public_key_pem):&lt;br /&gt;
    key = RSA.import_key(public_key_pem)&lt;br /&gt;
    h = SHA256.new(message.encode(&amp;#039;utf-8&amp;#039;))&lt;br /&gt;
    verifier = PKCS1_v1_5.new(key)&lt;br /&gt;
    return verifier.verify(h, signature)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --- Diffie-Hellman Key Exchange ---&lt;br /&gt;
&lt;br /&gt;
def dh_generate_parameters(key_size=2048):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Generate DH group parameters (p, g).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    from Crypto.PublicKey import DSA&lt;br /&gt;
    # Use DSA to obtain safe DH parameters — p prime, g generator&lt;br /&gt;
    dsa_key = DSA.generate(key_size, randfunc=Random.new().read)&lt;br /&gt;
    params = dsa_key.p, dsa_key.g&lt;br /&gt;
    return params&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def dh_generate_keypair(p, g):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Generate a DH private key (a) and public key (A = g^a mod p).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    a = int.from_bytes(Random.new().read(p.bit_length() // 8 + 8), &amp;#039;big&amp;#039;) % (p - 1)&lt;br /&gt;
    A = pow(g, a, p)&lt;br /&gt;
    return a, A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def dh_compute_shared(their_public, my_private, p):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Compute shared secret s = (their_public)^my_private mod p.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return pow(their_public, my_private, p)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    # --- RSA demo ---&lt;br /&gt;
    print(&amp;quot;=== RSA Key Generation ===&amp;quot;)&lt;br /&gt;
    priv, pub = rsa_generate_keys(2048)&lt;br /&gt;
    print(&amp;quot;Private key (first 120 chars): %s...&amp;quot; % priv[:120])&lt;br /&gt;
    print(&amp;quot;Public  key (first 120 chars): %s...&amp;quot; % pub[:120])&lt;br /&gt;
&lt;br /&gt;
    message = &amp;quot;Hello from RSA&amp;quot;&lt;br /&gt;
    ct = rsa_encrypt(message, pub)&lt;br /&gt;
    print(&amp;quot;\n=== RSA Encryption ===&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Ciphertext (hex): %s&amp;quot; % ct.hex()[:80])&lt;br /&gt;
&lt;br /&gt;
    pt = rsa_decrypt(ct, priv)&lt;br /&gt;
    print(&amp;quot;\n=== RSA Decryption ===&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Decrypted: &amp;#039;%s&amp;#039;&amp;quot; % pt)&lt;br /&gt;
&lt;br /&gt;
    sig = rsa_sign(message, priv)&lt;br /&gt;
    print(&amp;quot;\n=== RSA Signing ===&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Signature (hex): %s&amp;quot; % sig.hex()[:80])&lt;br /&gt;
&lt;br /&gt;
    ok = rsa_verify(message, sig, pub)&lt;br /&gt;
    print(&amp;quot;\n=== RSA Verification ===&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Signature valid: %s&amp;quot; % ok)&lt;br /&gt;
&lt;br /&gt;
    # --- Diffie-Hellman demo ---&lt;br /&gt;
    print(&amp;quot;\n=== Diffie-Hellman Key Exchange ===&amp;quot;)&lt;br /&gt;
    p, g = dh_generate_parameters(2048)&lt;br /&gt;
    print(&amp;quot;DH  p  (first 80 hex chars): %s...&amp;quot; % hex(p)[:80])&lt;br /&gt;
    print(&amp;quot;DH  g  (first 80 hex chars): %s...&amp;quot; % hex(g)[:80])&lt;br /&gt;
&lt;br /&gt;
    a_priv, a_pub = dh_generate_keypair(p, g)&lt;br /&gt;
    b_priv, b_pub = dh_generate_keypair(p, g)&lt;br /&gt;
    print(&amp;quot;Alice public (first 80 hex): %s...&amp;quot; % hex(a_pub)[:80])&lt;br /&gt;
    print(&amp;quot;Bob   public (first 80 hex): %s...&amp;quot; % hex(b_pub)[:80])&lt;br /&gt;
&lt;br /&gt;
    s_alice = dh_compute_shared(b_pub, a_priv, p)&lt;br /&gt;
    s_bob   = dh_compute_shared(a_pub, b_priv, p)&lt;br /&gt;
    print(&amp;quot;Alice shared secret matches Bob: %s&amp;quot; % (s_alice == s_bob))&lt;br /&gt;
    print(&amp;quot;Shared secret (first 80 hex): %s...&amp;quot; % hex(s_alice)[:80])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CryptoFlag}}&lt;br /&gt;
&lt;br /&gt;
{{PythonFlag}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Security]]&lt;br /&gt;
[[Category:Encryption]]]]&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>