2017-06-19 1 views
0

Je travaille sur un cours en ligne qui nous permet de créer un chiffrement césar et vigenere, mais nous avons d'abord créé deux fonctions; un pour trouver la position d'une lettre dans une variable alphabet, et un pour faire tourner un caractère donné pour un nombre donné de fois (j'ai vu que ord() et chr() fonctionnent mieux, mais l'affectation veut que nous nous concentrions sur des concepts plus simples pour l'instant, je suppose).Chiffrement Python Vigenere avec fonctions requises

J'ai réussi à faire fonctionner la fonction César, mais je ne suis pas sûr de la façon d'aller de l'avant avec le chiffre de vigenere. J'ai regardé de nombreuses vidéos et regardé autour de ce site, mais je n'en ai trouvé aucun qui permette la préservation d'espaces et de caractères non alphabétiques. Quelqu'un peut-il me diriger dans la bonne direction de la façon de démarrer la fonction 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

faites votre alphabet couvrir n'importe quel caractère que vous voulez; faire l'addition '% len (alphabet)'. cryptage avec 'rot'; décryptage avec 'len (alphabet) -rot'. –

+0

Où dites-vous que je devrais mettre le modulo Len (alphabet)? Dans ma fonction de cryptage actuelle? –

+0

dans 'rotate_character' au lieu de'% 26' ... –

Répondre

1

suite à mes commentaires; utiliser tous les caractères imprimables comme alphabet:

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

La cession nous oblige à utiliser l'alphabet comme une chaîne, donc je suppose que je peux remplacer ce que vous avez pour ma chaîne? De plus, je n'ai pas encore rencontré ''. Est-ce que cela ne fait que rajouter toutes les pièces en une seule chaîne? –

+0

oui et oui. essayez d'insérer n'importe quel alphabet que vous voulez. –

+0

J'ai essayé votre réponse, et dans la plupart des cas cela fonctionne, mais malheureusement, le devoir veut que nous conservions les caractères non alphabétiques. Alors le ! resterait un! même crypté, comme le ferait un espace. –