2011年2月14日月曜日

PythonでDiffie-Hellman鍵交換

PythonとDiffie-Hellman鍵交換を学んだので、実装してみよう。
共通鍵の値が同じになるってことを確認するだけのコードですが。

細かいところはあまり気にせず実装したので、大きな数だとオーバーフローするし、負数はエラーが出ます。

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
                


ターミナルで実行しました。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-02-1423.18.15-2011-02-14-23-00.png

実際は、サーバーとのやり取りだから、もっと複雑なんだろうけど、共通鍵の値が同じになることを確かめました。

それにしても、暗号鍵理論って面白いな、って思う今日このごろ。


0 件のコメント:

コメントを投稿