Vigenere暗号。 Python解析アルゴリズム

最近、私は「スパイ」の幼少期を覚えていて、少なくとも基本的な暗号化方法を学びたいと思っていました。 そして、最初の選択はVigenere暗号にありました。 それ自体は非常に複雑ではありませんが、長い間暗号と考えられてきました。 誰かがカジスキーがコードを完全に解読するまで、XVからXIXまでの1世紀のコマーシャル。

ただし、Wikipediaの引用は、アルゴリズム自体の説明のみに制限されています。



この方法は、文字が特定の位置にシフトされたシーザーの高度なシーザーです。

Vigenère暗号は、異なるシフト値を持ついくつかのシーザー暗号のシーケンスで構成されています。



数字が各文字に対応する特定のアルファベットがあるとします:



画像



次に、文字a〜zが数字0〜25に対応する場合、Vigenere暗号化は式の形式で記述できます。



画像



デコード:



画像



実際、これら2つの式以外には何も必要なく、実装を開始できます。



ここで、私がアルゴリズムを実装しようとしたのは、よりシンプルでエレガントではなく、最も理解可能で詳細なものでした。

実は、先生。



「Hello world」という単語をトリッキーなキー「key」でエンコードします。



最初に、暗号化に参加する文字の辞書を作成する必要があります。

def form_dict(): d = {} iter = 0 for i in range(0,127): d[iter] = chr(i) iter = iter +1 return d
      
      





次に、単語の文字と辞書の文字を比較し、対応する数値インデックスを割り当てる必要があります

 def encode_val(word): list_code = [] lent = len(word) d = form_dict() for w in range(lent): for value in d: if word[w] == d[value]: list_code.append(value) return list_code
      
      





そして、単語とキーをエンコードし、2つのインデックスリストを取得しました。

値= [72、101、108、108、111、32、119、111、114、108、100]

キー= [107、101、121]



次に、full_encode()関数を使用して、キーインデックスと単語のインデックスを比較します。

 def comparator(value, key): len_key = len(key) dic = {} iter = 0 full = 0 for i in value: dic[full] = [i,key[iter]] full = full + 1 iter = iter +1 if (iter >= len_key): iter = 0 return dic def full_encode(value, key): dic = comparator(value, key) print 'Compare full encode', dic lis = [] d = form_dict() for v in dic: go = (dic[v][0]+dic[v][1]) % len(d) lis.append(go) return lis def decode_val(list_in): list_code = [] lent = len(list_in) d = form_dict() for i in range(lent): for value in d: if list_in[i] == value: list_code.append(d[value]) return list_code
      
      





暗号インデックスを取得し、decode_val()関数を使用して文字列に変換します。



{0:[72、107]、1:[101、101]、2:[108、121]、3:[108、107]、4:[111、101]、5:[32、121]、6 :[119、107]、7:[111、101]、8:[114、121]、9:[108、107]、10:[100、101]}



インデックス:[52、75、102、88、85、26、99、85、108、88、74]



コード化されたスーパーシークレットメッセージ: 4KfXUcUlXJ取得します



これはすべて、full_decode()関数を使用してデコードできます。最初の引数は暗号数値インデックスのリストで、2番目はキーインデックスのリストです。



 def full_decode(value, key): dic = comparator(value, key) print 'Deshifre=', dic d = form_dict() lis =[] for v in dic: go = (dic[v][0]-dic[v][1]+len(d)) % len(d) lis.append(go) return lis
      
      







それと同じように、暗号インデックスを取得し、すでにおなじみのdecode_val()関数を使用して文字列に変換します。

[72、101、108、108、111、32、119、111、114、108、100]

そして出来上がり! 暗号化された単語: Hello world



まあ、主な課題

 if __name__ == "__main__": word = 'Hello world' key = 'key' print ': '+ word print ': '+ key key_encoded = encode_val(key) value_encoded = encode_val(word) print 'Value= ',value_encoded print 'Key= ', key_encoded shifre = full_encode(value_encoded, key_encoded) print '=', ''.join(decode_val(shifre)) decoded = full_decode(shifre, key_encoded) print 'Decode list=', decoded decode_word_list = decode_val(decoded) print 'Word=',''.join(decode_word_list)
      
      







この記事では、Pythonの初心者でもできるだけ明確になるように、すべてを説明しようとしました。 この暗号化アルゴリズムの信頼性は100%ではありませんが、同じRSAなど、より深刻なことを学習する道を進んだ人に適しています。



リンクとコード:

ウィキペディアのVizhenerコードの説明

Pythonソースコード



All Articles