2016-12-10 10 views
2

Vigenere Cipherについてthis tutorialを見て、私は(うまくいけば)その基本的な概念を理解しています。文字列にキーを割り当て、その文字列の各文字を、キーの各文字のアルファベット位置の値(0ベース)でシフトします。だから私は、最初からVigenere暗号を書いていたよう VigenèreCipher Function in Python

Meet me in the park at eleven am 
baco nb ac onb acon ba conbac on 

Negh zf av huf pcfx bt gzrwep oz 

になり、キーとしてベーコンを使用しているとき、私は最初のステップは、文字列のキーを割り当てることがあることを知っています。私がこの作業をしている間、文字列に特殊文字(!、@、#など)があればそれを保存できるように、各文字がアルファであるかどうかを認識したいと思います。

text = input("Enter some text:") 

def encrypt(text): 

#key = bacon 
encrypted = [] 
baconvalue = {'A':0, 'a':0, 'B':1, 'b':1, 'C':2, 'c':2, 'D':3, 'd':3, 'E':4, 'e':4, 'F':5, 'f':5, 'G':6, 'g':6, 'H':7, 'h':7, 'I':8, 'i':8, 'J':9, 'j':9, 'K':10, 'k':10, 'L':11, 'l':11, 'M':12, 'm':12, 'N': 13, 'n':13, 'O':14, 'o':14, 'P':15, 'p':15, 'Q':16, 'q':16, 'R':17, 'r':17, 'S':18, 's':18, 'T':19, 't':19, 'U':20, 'u':20, 'V':21, 'v':21, 'W':22, 'w':22, 'X':23, 'x':23, 'Y':24, 'y':24, 'Z':25, 'z':25 } 


for letter in text: 

#assign 'bacon' to text to get rotation value for each character 
#preserve alpha characters 

     if letter.isalpha(): 

#character in string rotates x amount according to the corresponding value of char in bacon 

      encrypted.append(letter, baconvalue)   

     else:  

      encrypted.append(letter)    

     return ''.join(encrypted) 

print(encrypt(text,)) 

しかし、わかるように、どこから始めてどこにベーコンを割り当てるのかわかりません。私は少なくとも正しい道を歩いていますか?可能であればお手伝いください。ありがとうございました。

+3

のアルファためのチェックが赤ニシンで、ちょうどあなたとあなたの実装を混乱させます。モジュロまたはxorを使用します。セット1の基本的な置き換えの暗号と、それを続けるならもっと多くのものをあなたに連れて行く良いセットの演習があります - http://cryptopals.com – pvg

答えて

1

ユーザーがキーとして入力する値で文字列をインデックスする方法は、変数starting_indexを作成し、それを= 0に設定することです。この方法では、文字列の最初の文字から繰り返しが始まり、先に作成したalphabet_pos辞書を使用してrotationの値を生成できます。

rotate関数を使用して、作成した新しい回転変数で文字を回転します。文字が辞書にある場合、encrypt関数はこの新しい文字を追加し、キーの最後のインデックス値に達するまで続きます。次に、暗号化された文字を一緒に結合します。

alphabet_pos = {'A':0, 'a':0, 'B':1, 'b':1, 'C':2, 'c':2, 'D':3, 'd':3, 
'E':4, 'e':4, 'F':5, 'f':5, 'G':6, 'g':6, 'H':7, 'h':7, 'I':8, 'i':8, 
'J':9, 'j':9, 'K':10, 'k':10, 'L':11, 'l':11, 'M':12, 'm':12, 'N': 13, 
'n':13, 'O':14, 'o':14, 'P':15, 'p':15, 'Q':16, 'q':16, 'R':17, 'r':17, 
'S':18, 's':18, 'T':19, 't':19, 'U':20, 'u':20, 'V':21, 'v':21, 'W':22, 
'w':22, 'X':23, 'x':23, 'Y':24, 'y':24, 'Z':25, 'z':25 } 

def alphabet_position(letter): 
    alphabet_pos = {'A':0, 'a':0, 'B':1, 'b':1, 'C':2, 'c':2, 'D':3, 
'd':3, 'E':4, 'e':4, 'F':5, 'f':5, 'G':6, 'g':6, 'H':7, 'h':7, 'I':8, 
'i':8, 'J':9, 'j':9, 'K':10, 'k':10, 'L':11, 'l':11, 'M':12, 'm':12, 
'N': 13, 'n':13, 'O':14, 'o':14, 'P':15, 'p':15, 'Q':16, 'q':16, 
'R':17, 'r':17, 'S':18, 's':18, 'T':19, 't':19, 'U':20, 'u':20, 'V':21, 
'v':21, 'W':22, 'w':22, 'X':23, 'x':23, 'Y':24, 'y':24, 'Z':25, 'z':25 
} 
    pos = alphabet_pos[letter] 
    return pos 

def rotate(letter, rot): 
    shift = 97 if letter.islower() else 65 
    return chr((ord(letter) + rot - shift) % 26 + shift) 

def encrypt(text, key): 
    encrypted = []  
    starting_index = 0 
    for letter in text: 
    # if it's alphanumerical, keep it that way 
    # find alphabet position 
     rotation = alphabet_position(key[starting_index]) 
    # if it's a space or non-alphabetical character, append and move on 
     if not letter in alphabet_pos: 
      encrypted.append(letter) 
     elif letter.isalpha():    
      encrypted.append(rotate(letter, rotation))    

    #if we've reached last index, reset to zero, otherwise + by 1 
     if starting_index == (len(key) - 1): 
      starting_index = 0 
     else: 
      starting_index += 1 

    return ''.join(encrypted)  

text = input("Enter some text:") 
key = input("Enter a key:") 

print(encrypt(text,key)) 
0

おそらく、あなたや他の人を助けるかもしれないヴィジュネル暗号を解読するための私の完全な実装では、メソッドを理解する(それは自己相関とフリードマン試験方法を使用しています)。

あなたはここにコードを見つけることができます:https://github.com/ferreirafabio/vigenere-py