From 1ab331ae9a809cb61743538f48e95d3be79854e4 Mon Sep 17 00:00:00 2001 From: Andrey Arapov Date: Fri, 12 Sep 2014 11:06:35 +0200 Subject: [PATCH] first commit --- README.md | 13 +++++ dhtest-run.png | Bin 0 -> 12789 bytes dhtest.py | 133 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 README.md create mode 100755 dhtest-run.png create mode 100755 dhtest.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..2f0b827 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +Diffie-Hellman key exchange example in python + +You can use as reference OpenSSL's dhparam module that can produce following output, e.g. + +```bash +openssl dhparam 16 |openssl dhparam -noout -text +Generating DH parameters, 16 bit long safe prime, generator 2 +This is going to take a long time +.++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++*++* + PKCS#3 DH Parameters: (16 bit) + prime: 61547 (0xf06b) + generator: 2 (0x2) +``` diff --git a/dhtest-run.png b/dhtest-run.png new file mode 100755 index 0000000000000000000000000000000000000000..ce3bfcc09d0f5446b66733d91b3f3a3a4e296019 GIT binary patch literal 12789 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 z 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. +# ------------------------------------- +# +# +# Notes: +# - Based on the https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange +# - The parameters used here are artificially small +# - I've tried to apply KISS principle here +# +# + +import random +from fractions import gcd + +class bcolors: + RED = '\033[91m' + DRED = '\033[31m' + GREEN = '\033[92m' + YELLOW = '\033[93m' + BLUE = '\033[94m' + PURPLE = '\033[95m' + CYAN = '\033[96m' + ENDC = '\033[0m' + + +# Primality test +# https://en.wikipedia.org/wiki/Primality_test#Python_implementation + +def is_prime(num): + if num <= 3: + if num <= 1: + return False + return True + if not num % 2 or not num % 3: + return False + for i in range(5, int(num ** 0.5) + 1, 6): + if not num % i or not num % (i + 2): + return False + return True + +print ":: Diffie-Hellman key exchange" +print + +# Alice and Bob agree to use a prime number p and base random g. + +print "1. Alice and Bob agree to use a prime number"+bcolors.BLUE+" p"+bcolors.ENDC+\ + " and base random "+bcolors.YELLOW+"g."+bcolors.ENDC +i = 0 +while i < 1: + rand = random.randint(100000, 999999) + if is_prime(rand): + p=rand + i += 1 + + +g = random.randint(1000000, 9999999) + +print bcolors.BLUE+"p"+bcolors.ENDC+" =", bcolors.BLUE, p, bcolors.ENDC, "\tprime?", is_prime(p) +print bcolors.YELLOW+"g"+bcolors.ENDC+" =", bcolors.YELLOW, g, bcolors.ENDC +print + + +print "2. Alice chooses a secret integer "+bcolors.DRED+"a"+bcolors.ENDC+\ + ", then sends Bob "+bcolors.CYAN+"A"+bcolors.ENDC+" = "+bcolors.YELLOW+"g"+bcolors.ENDC+\ + " ^ "+bcolors.DRED+"a"+bcolors.ENDC+" mod "+bcolors.BLUE+"p"+bcolors.ENDC +a = random.randint(10000, 99999) +print bcolors.DRED+"a"+bcolors.ENDC+" =", bcolors.DRED, a, bcolors.ENDC +A = (g ** a) % p +print bcolors.CYAN+"A"+bcolors.ENDC+" =", bcolors.YELLOW, g, bcolors.ENDC, "^", \ + bcolors.DRED, a, bcolors.ENDC, "mod", bcolors.BLUE, p, bcolors.ENDC, "=",\ + bcolors.CYAN, A, bcolors.ENDC +print + + +print "3. Bob chooses a secret integer "+bcolors.DRED+"b"+bcolors.ENDC+\ + ", then sends Alice "+bcolors.CYAN+"B"+bcolors.ENDC+" = "+bcolors.YELLOW+"g"+bcolors.ENDC+\ + " ^ "+bcolors.DRED+"b"+bcolors.ENDC+" mod "+bcolors.BLUE+"p"+bcolors.ENDC +b = random.randint(10000, 99999) +print bcolors.DRED+"b"+bcolors.ENDC+" =", bcolors.DRED, b, bcolors.ENDC +B = (g ** b) % p +#print bcolors.CYAN+"B"+bcolors.ENDC+" =", bcolors.CYAN, B, bcolors.ENDC +print bcolors.CYAN+"B"+bcolors.ENDC+" =", bcolors.YELLOW, g, bcolors.ENDC, "^", \ + bcolors.DRED, b, bcolors.ENDC, "mod", bcolors.BLUE, p, bcolors.ENDC, "=",\ + bcolors.CYAN, B, bcolors.ENDC +print + + +print "4. Alice computes her "+bcolors.RED+"s"+bcolors.ENDC+" = "+bcolors.CYAN+"B"+bcolors.ENDC+\ + " ^ "+bcolors.DRED+"a"+bcolors.ENDC+" mod "+bcolors.BLUE+"p"+bcolors.ENDC +s1 = (B ** a) % p +print bcolors.RED+"s"+bcolors.ENDC+" =", bcolors.CYAN, B, bcolors.ENDC, "^", \ + bcolors.DRED, a, bcolors.ENDC, "mod", bcolors.BLUE, p, bcolors.ENDC, "=", bcolors.RED, s1, bcolors.ENDC +print + + +print "5. Bob computes his "+bcolors.RED+"s"+bcolors.ENDC+" = "+bcolors.CYAN+"A"+bcolors.ENDC+\ + " ^ "+bcolors.DRED+"b"+bcolors.ENDC+" mod "+bcolors.BLUE+"p"+bcolors.ENDC +s2 = (A ** b) % p +#print bcolors.RED+"s"+bcolors.ENDC+" =", bcolors.RED, s2, bcolors.ENDC +print bcolors.RED+"s"+bcolors.ENDC+" =", bcolors.CYAN, A, bcolors.ENDC, "^", \ + bcolors.DRED, b, bcolors.ENDC, "mod", bcolors.BLUE, p, bcolors.ENDC, "=", bcolors.RED, s2, bcolors.ENDC +print + + +print "6. Alice and Bob now share a secret ( the number"+bcolors.RED, s1, bcolors.ENDC+") which had never passed over the channel" +print + +print " The only "+bcolors.BLUE+"p",p,bcolors.ENDC+", "+bcolors.YELLOW+"g", g, bcolors.ENDC+", "+\ + bcolors.CYAN+"A",A,bcolors.ENDC+" and "+bcolors.CYAN+"B",B,bcolors.ENDC+" have passed over the channel" +print + +print " ", bcolors.DRED, "a", a, bcolors.ENDC, "," , bcolors.DRED, "b", b, bcolors.ENDC, \ + "and", bcolors.RED, "s", s1, bcolors.ENDC, "have never passed over the channel" +print +