The Vigenere Cipher follows its name from a French cryptographer Blaise de Vigenere. This cipher is a substitution cipher that supports encryption and decryption of only alphabetic text.
There is a Vigenere’s Table which is responsible for encrypting the plaintext with the help of a key.
Table of Contents
Vigenere Cipher Table
The table consists of 26 rows and columns with each cell storing a single letter. The storage of the letter starts from A-Z in the first row, and a left shift operation influences each successive row.

The ciphertext is formed by letters indexed out from the above table using the row and column names.
Encryption Process of Vigenere Cipher
Let us run an example through the encryption process for the better understanding of the Vigenere Cipher.
We need a plaintext and a key before starting the encryption process.

In order to create the ciphertext, we pick the first letter of each of the above values. 'J'
from the plaintext and 'B'
from the key. We find the table entry for which 'J'
is the row name, and 'B'
is the column name.

For every letter of the plaintext, we need a letter from the key. If length of the key is small, the algorithm repeats the key until the it matches the length.

I’ve highlighted the table entries used during the process:

Decryption Process
The decryption process involves two elements: The ciphertext, and the key.

One thing to note here is that the key must not change during the encryption and decryption process.
In order to decode each letter, we pick the first letter of the key 'B'
and go through column B's
values. As soon as we encounter the letter from ciphertext 'K'
, we check the row name of that table entry. The row name is the decoded letter for the corresponding alphabet of the ciphertext.

We follow the similar steps for each alphabet and end up decoding the complete ciphertext.
Implementation of Vigenere Cipher in C++
#include<iostream> using namespace std; // Function to extend the key to the length of plaintext string get_full_key(string pt, string k){ if(k.size() >= pt.size()) return k; else{ int psize = pt.size()-k.size(); int ksize = k.size(); while(psize >= ksize){ k += k; psize -= ksize; } k += k.substr(0, psize); return k; } } // Encryption Function string get_encryption(string pt, string k){ string ct = ""; for(int i=0;i<pt.size();i++) ct += (char) (((int)pt[i]-'A' + (int)k[i]-'A') % 26) + 'A'; return ct; } // Decryption Function string get_decryption(string ct, string k){ string pt = ""; for(int i=0;i<ct.size();i++) pt += (char) ((((int)ct[i]- 'A' - (k[i] -'A')) + 26) % 26) + 'A'; return pt; } int main(){ // The Plaintext string plaintext = "JOURNALDEV"; // The key string key = "BEST"; // Function call to extend the key size key = get_full_key(plaintext, key); cout<<" THE PLAINTEXT: "<< plaintext <<endl; cout<<" THE KEY: "<< key <<endl; // Function call to encode the data string ciphertext = get_encryption(plaintext, key); cout<<" THE CIPHERTEXT: "<< ciphertext <<endl; // Function call to decode the data plaintext = get_decryption(ciphertext, key); cout<<" THE DECODED PLAINTEXT: "<< plaintext <<endl; return 1; }
Output:
THE PLAINTEXT: JOURNALDEV THE KEY: BESTBESTBE THE CIPHERTEXT: KSMKOEDWFZ THE DECODED PLAINTEXT: JOURNALDEV
The insight behind the implementation
Vigenere’s Table table was built with a lot of thought behind it. We can exploit certain properties of the table for an efficient implementation of the Vigenere Cipher.
The sophisticated arrangement of letters leads to the following two mathematical properties:
Encoding Principle

Decoding Principle

The above equations mean that if we consider any cell, then the alphabet contained in that cell can be obtained using the row and column numbers, and vice versa.
Conclusion
The world of cryptography has no limits to the ideas behind such kind of substitution ciphers. Curious readers can pick up topics like Ceaser Cipher and Playfair Cipher in order to get closer to the realm of cryptography.
We hope this article was easy to follow. Do drop in your comment if you loved this article. We’d love to hear your thoughts!
Apt and Simple. Gooood Job!!!!!