共通鍵の値が同じになるってことを確認するだけのコードですが。
細かいところはあまり気にせず実装したので、大きな数だとオーバーフローするし、負数はエラーが出ます。
Diffie_Hellman.py
#encoding: utf8 '''素数Xと整数Yは共通認識である''' def dh_algorithm(): # もうあらかじめ値を決めておこう。 print "共有情報として、素数 X = 113, 素数 Y = 2 があります" Prime_X = 113 Prime_Y = 2 # Aさんがランダムに選んだ数p と Bさんがランダムに選んだ数q random_p = int(raw_input("Aさんの乱数を入力してください : ")) random_q = int(raw_input("Bさんの乱数を入力してください : ")) # Aさんの公開値Pを求める P = create_publicKey(Prime_X, Prime_Y, random_p) print "\nAさんの公開値P : %d" % P # Bさんの公開値Qを求める Q = create_publicKey(Prime_X, Prime_Y, random_q) print "Bさんの公開値Q : %d" % Q # Aさんの共通鍵の値は、Bさんから送られてきた公開値を使って A_Z = create_commonKey(Prime_X, Q, random_p) print "Aさんの共有値A_Z : %d" % A_Z # Bさんの共通鍵の値は、Aさんから送られてきた公開値を使って B_Z = create_commonKey(Prime_X, P, random_q) print "Bさんの共有地B_Z : %d \n" % B_Z if(A_Z == B_Z): print "作成した共通鍵の値は同じです。\n" else: print "作成した共通鍵の値は等しくありません。\n" def create_publicKey(prime_X, prime_Y, random): '''共有情報である素数Xと素数Yと、自身で定義した乱数Zで、公開値Pを作成する''' P = pow(prime_Y, random, prime_X) return P def create_commonKey(prime, publicKey, random): '''共有情報である素数と、相手の公開値と、自身で定義した乱数と、 を使って、共通鍵Zの値を生成する''' Z = pow(publicKey, random, prime) return Z |
ターミナルで実行しました。
実際は、サーバーとのやり取りだから、もっと複雑なんだろうけど、共通鍵の値が同じになることを確かめました。
それにしても、暗号鍵理論って面白いな、って思う今日このごろ。
0 件のコメント:
コメントを投稿