2017-06-19 16 views
0

私は皇帝の暗号とvigenere暗号を作成するオンラインコースに取り組んでいますが、まず2つの機能を作成しました。 1つはアルファベット変数の文字の位置を見つけること、もう1つは与えられた文字を与えられた時間だけ回転させることです(私はord()とchr()がうまくいくことを見てきましたが、今のところ、私は推測する)。必要な機能を持つPython Vigenere暗号

私はシーザー機能を働かせることができましたが、vigenere暗号でどのように進めるかはわかりません。私は多くのビデオを見てこのサイトを見回しましたが、スペースやアルファベット以外の文字の保存を許可するものは見つかりませんでした。どのようにvigenere関数を開始する方法の正しい方向に私を指すことができますか?

#Create function alphabet_position(letter) to turn letter into number 
#such as a=0 or e=4, using lowercase to make sure case doesnt matter. 
def alphabet_position(letter): 
    alphabet ="abcdefghijklmnopqrstuvwxyz" #Lists alphabet for a key 
    lower_letter = letter.lower() #Makes any input lowercase. 
    return alphabet.index(lower_letter) #Returns the position of input as a number. 

def rotate_character(char, rot): 
    alphabet = "abcdefghijklmnopqrstuvwxyz" 
    if char.isalpha(): 
     a = alphabet_position(char) 
     a = (a + rot) % 26   #needs modulo 
     a = (alphabet[a]) 
     if char.isupper(): 
      a = a.title() 
     return a 
    else: 
     return char 

def encrypt(text, rot): 
    list1 = "" 
    for char in text: 
     list1 += rotate_character(char, rot) 
    return list1 



def main(): 
    x = input("Type a message: ") 
    y = input("Rotate by: ") 
    #result = rotate_character(x, y) #Not needed once encrypt function works. 
    result = encrypt(x, y) 
    print (result) 

if __name__ == '__main__': 
    main() 
+0

あなたのアルファベットは任意の文字をカバーします。 '%len(アルファベット) 'を追加します。腐敗による暗号化。 'len(アルファベット)-rot 'で解読する。 –

+0

あなたはLen(アルファベット)を法とするべきですか?私の現在の暗号化機能の中で? '%26'の代わりに' rotate_character'に –

+0

... –

答えて

1

すべての印刷物をアルファベットとして使用します。

from string import ascii_letters, digits, punctuation, whitespace 

ALPHABET = ascii_letters + digits 
STATIC_ALPHABET = punctuation + whitespace 

# minor speedup 
ALPHA_INDEX = {a: i for i, a in enumerate(ALPHABET)} 
STATIC_ALPHABET_SET = set(STATIC_ALPHABET) 
MOD = len(ALPHABET) 

def encrypt(char, key): 
    if char in STATIC_ALPHABET_SET: 
     return char 
    else: 
     return ALPHABET[(ALPHA_INDEX[char] + key) % MOD] 

def decrypt(char, key): 
    if char in STATIC_ALPHABET_SET: 
     return char 
    else: 
     return ALPHABET[(ALPHA_INDEX[char] + MOD - key) % MOD] 

key = 17 
plain = 'Hello World!' 
enc = ''.join(encrypt(char, key) for char in plain) 
print(enc) # YvCCF dFICu! 
dec = ''.join(decrypt(char, key) for char in enc) 
print(dec) # Hello World! 
+0

私たちは文字列としてアルファベットを使用するので、私はあなたが私の文字列を私のものに置き換えることができると推測しています。また、私は ''に参加していません。すべての部分を1つの文字列に戻すだけですか? –

+0

はい&はい。必要なアルファベットを挿入してみてください。 –

+0

私はあなたの答えを試してみましたが、ほとんどの部分はうまくいきましたが、残念なことに私たちはアルファベット以外の文字を保存したいと考えています。だから!残るだろう!暗号化されていても、スペースと同じように。 –

関連する問題