Freddy
Freddy

Reputation: 867

How to decrypt a message using the Vigenere Cipher

Recently, I have been trying to educate myself on how to encrypt and decrypt using the Vigenere Cipher.

I have successfully encrypted the message and these are the steps I undertook to achieve encryption:

Encryption Key: Set

Message: Top secret

Step 1: Numerical representation of key is 18, 4, 19 (Using the table below)

enter image description here

Working Out:

Reminder:

P is the set of plaintext units

C is the set of ciphertext units

K is the set of keys

E: P x K -> C is the encryption function

D: C x K -> P is the decryption function

enter image description here


Plaintext: top secret

Ciphertext: ISIKIVJIM


Although I have managed to encrypt the message "top secret" I am struggling to decrypt messages using the Vigenere Cipher method using the numerical technique I used above. Can someone explain to me how I can decrypt lets say: ISIKIVJIM (the ciphertext from above) to its original plain text message which is "top secret".

Thanks.

Upvotes: 0

Views: 3357

Answers (2)

Syed Rahman
Syed Rahman

Reputation: 55

I recently wrote a java program that encrypts and decrypts in Vigenere using bytes. You need to convert the plain text/ crypt text into byte array and pass it in.

public static byte [] encryptVigenere (byte [] pt, String key)
{
    byte [] c_text = new byte [pt.length];
    byte [] key_text = key.getBytes();
    byte tmp;
    int shift;

    for (int i = 0, j = 0; i < pt.length; i++)
    {
        if (j >= key_text.length)
            j = 0;

        shift = key_text[j] - 65; //index of alphabet
        tmp = (byte) (pt[i] + shift);

        if (tmp > 'Z')
            tmp = (byte) (pt[i] - (26-shift));

        c_text[i] = tmp;
        j++;
    }
    return c_text;
}

public static byte [] decryptVigenere (byte [] ct, String key)
{
    byte [] p_text = new byte [ct.length];
    byte [] key_text = key.getBytes();
    byte tmp;
    int shift;

    for (int i = 0, j = 0; i < ct.length; i++)
    {
        if (j >= key_text.length)
            j = 0;

        shift = key_text[j] - 65; //index of alphabet
        tmp = (byte) (ct[i] - shift);

        if (tmp < 'A')
            tmp = (byte) (ct[i] + (26-shift));

        p_text[i] = tmp;
        j++;
    }
    return p_text;
}

Upvotes: 0

uSeemSurprised
uSeemSurprised

Reputation: 1834

As pointed out in the comments the decryption formula is : p = c - k mod 26, also note that we have to perform modular arithmetic so our answer for any input should belong in the range of 0 - 25, i.e if we get a negative number we can add 26(i.e the number we are taking modulo by) until we are within this range you can read more about this here :

https://en.wikipedia.org/wiki/Modular_arithmetic

So the decryption will be like :

L = 11 - 18 = -7 mod 26 = -7 + 26 = 19 = T

S = 18 - 4 = 14 mod 26 = 14 = O

I = 8 - 19 = -11 mod 26 = -11 + 26 = 15 = P

ans so on...

I have also written a c++ code : http://ideone.com/M3BAmq

Upvotes: 0

Related Questions