Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to start again at the beginning of the word?

To apply a Vigenere coding, we have to shift the letters but not all by the same number. The key is this time a keyword which each letter gives us the shift to be done (taking A for a shift of 0, B for a shift of 1 …).

Let’s take an example to explain the method: Let’s imagine that the keyword is "MATHS" and the word to code is "PYTHON".
To code P, I shift the number corresponding to M, i.e. 12 (because we start at 0 with A) which gives me B as coding for P.
Let’s move on to Y: I shift it by the number corresponding to A, i.e. 0, so Y is the coding for Y here.
Let’s go to T which is shifted by the number corresponding to T, i.e. 19, so T becomes M once shifted
And so on.

import string

def vigenere_cipher(msg, shift):
    encrypted = ''
    for i,j in zip(msg,shift):
        new_index = ( string.ascii_uppercase.index(i) + string.ascii_uppercase.index(j) ) % 26
        encrypted += string.ascii_uppercase[new_index]
    return encrypted
print(vigenere_cipher('PYTHON', 'MATH'))

If our keyword is too short we start again at the beginning of the word, i.e. N will be shifted by the number corresponding to M.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

My problem right here is actually with the last part, How I can simply say that if the keyword is too short we start again at the beginning of the word ?

Because only "PYTH" part is encrypted to "BYMO" with MATH as a key but not the "ON"

>Solution :

Just add the line shift = shift * (len(msg) // len(shift) + 1) at the start of the function so shift is repeated until it’s longer than msg (e.g. this line turns MATH into MATHMATH)

import string

def vigenere_cipher(msg, shift):
    shift = shift * (len(msg) // len(shift) + 1)
    encrypted = ''
    for i,j in zip(msg,shift):
        new_index = (string.ascii_uppercase.index(i) + string.ascii_uppercase.index(j)) % 26
        encrypted += string.ascii_uppercase[new_index]
    return encrypted

    
print(vigenere_cipher('PYTHON', 'MATH'))

Output: BYMOAN

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading