ただし、Wikipediaの引用は、アルゴリズム自体の説明のみに制限されています。
この方法は、文字が特定の位置にシフトされたシーザーの高度なシーザーです。
Vigenère暗号は、異なるシフト値を持ついくつかのシーザー暗号のシーケンスで構成されています。
数字が各文字に対応する特定のアルファベットがあるとします:
![画像](https://habrastorage.org/storage/84da6809/907a012b/7e716624/1cedb899.png)
次に、文字a〜zが数字0〜25に対応する場合、Vigenere暗号化は式の形式で記述できます。
![画像](https://habrastorage.org/getpro/habr/post_images/d11/dee/51d/d11dee51d21881378abfa85de93c582f.png)
デコード:
![画像](https://habrastorage.org/getpro/habr/post_images/182/082/236/1820822360b07b19784dd1256c9c2662.png)
実際、これら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ソースコード