Search code examples
pythonencryptioncaesar-ciphervigenere

IndexError: list index out of range error in python


I'm writing a vigenere cipher for a personal project and i am coming across a index error. it is saying IndexError: list index out of range. The line causing this is IndexValue = Alphabet.index(keyList[keyIncrement]) + Alphabet.index(plainTextChar).

Here is all of the code:

playing = True
string = ""
Alphabet = ('z','a','b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')

while playing == True:
    string = ""
    eord = input('Type "d" to "decrypt" and "e" to "encrypt": ')

    if eord == 'e':
        texte = input ("Type your word to encrypt: ")
        key1 = int(input("Choose a key between 1-26: "))
        for letter in texte:
            number = (ord(letter)) + (key1)
            letter=(chr(number))
            string = (str(string)) + (str(letter))
        print (string)
        keyword = input ("Type 'encrypt' code further or 'decrypt' further: ")

        if keyword == 'encrypt':
            plainText = input("Please enter the plain text: ")
            key = input("Please enter the key: ")
            keyList = []
            keyLength = 0
            while keyLength < len(plainText):
                for char in key:
                     if keyLength < len(plainText):
                         keyList.append(str(char))
                         keyLength = keyLength + 1
                         CipherText = [] 
                         IndexValue = 0
                         keyIncrement = 0
                     for plainTextChar in plainText:
                         IndexValue = Alphabet.index(keyList[keyIncrement]) + Alphabet.index(plainTextChar)
                         while IndexValue > 26:
                             IndexValue = IndexValue - 26
                         CipherText.append(Alphabet[IndexValue])
                         keyIncrement = keyIncrement + 1
                         print (''.join(CipherText))

            finish = input('Would you like to go again Y or N')
            if finish == 'n' or finish == 'N':
                retry = input ("Would you like to go again? Y or N: ")
                if retry == 'N' or retry == 'n':
                    print ("Please exit the window")
                    import time
                    time.sleep(1)
                    import sys
                    sys.exit()

    elif eord == 'd':
        texd = input ("Type your word to decrypt: ")
        key2 = int(input("Choose a key between 1-16: "))

        for letter in texd:
            number = (ord(letter)) - (key2)
            letter=(chr(number))
            string = (str(string)) + (str(letter))
        print (string)
        keyword = input ("Type 'encrypt' code further or 'decrypt' further: ")

        if keyword == 'decrypt':
             plainText = input("Please enter the plain text: ")
             key = input("Please enter the key: ")
             keyList = []
             keyLength = 0
             while keyLength < len(plainText):
                 for char in key:
                     if keyLength < len(plainText):
                         keyList.append(str(char))
                         keyLength = keyLength - 1
                         completeCipherText = [] 
                         cipherCharIndexValue = 0
                         keyIncrement = 0
                     for plainTextChar in plainText:
                         cipherCharIndexValue = Alphabet.index(keyList[keyIncrement]) + Alphabet.index(plainTextChar)
                         while cipherCharIndexValue > 26:
                             cipherCharIndexValue = cipherCharIndexValue + 26
                         completeCipherText.append(Alphabet[cipherCharIndexValue])
                         keyIncrement = keyIncrement - 1
                         print (''.join(completeCipherText))

                         finish = input('Would you like to go again Y or N')
                         if finish == 'n' or finish == 'N':
                             retry = input ("Would you like to go again? Y or N: ")
                             if retry == 'N' or retry == 'n':
                                 print ("Please exit the window")
                                 import time
                                 time.sleep(1)
                                 import sys
                                 sys.exit()

The section it is happening is this:

if keyword == 'encrypt':
            plainText = input("Please enter the plain text: ")
            key = input("Please enter the key: ")
            keyList = []
            keyLength = 0
            while keyLength < len(plainText):
                for char in key:
                     if keyLength < len(plainText):
                         keyList.append(str(char))
                         keyLength = keyLength + 1
                         CipherText = [] 
                         IndexValue = 0
                         keyIncrement = 0
                     for plainTextChar in plainText:
                         IndexValue = Alphabet.index(keyList[keyIncrement]) + Alphabet.index(plainTextChar)
                         while IndexValue > 26:
                             IndexValue = IndexValue - 26
                         CipherText.append(Alphabet[IndexValue])
                         keyIncrement = keyIncrement + 1
                         print (''.join(CipherText))

What is wrong with the code because i tried using pycharm and it highlighted [keyIncrement] but i don't know how to fix this. Thanks for any help in advance.


Solution

  • Your problem was this if keyLength < len(plainText): statement blocking the for character in key from adding each character to list before running the rest of the code.

    while keyLength < len(plainText):
        try:
            char = key[num]
        except IndexError:
            num = 0
            char = key[num]
        keyList.append(str(char))
        keyLength += 1
        num += 1
        CipherText = [] 
        IndexValue = 0
        keyIncrement = 0
    for plainTextChar in plainText:
         IndexValue = Alphabet.index(keyList[keyIncrement]) + Alphabet.index(plainTextChar)
         while IndexValue > 26:
             IndexValue = IndexValue - 26
         CipherText.append(Alphabet[IndexValue])
         keyIncrement = keyIncrement + 1
         print (''.join(CipherText))
    

    Test run:

    Type "d" to "decrypt" and "e" to "encrypt": e
    Type your word to encrypt: hello
    Choose a key between 1-26: 3
    khoor
    Type 'encrypt' code further or 'decrypt' further: encrypt
    Please enter the plain text: darrien
    Please enter the key: brit
    f
    fs
    fsa
    fsal
    fsalk
    fsalkw
    fsalkww
    Would you like to go again Y or N