Vigenere Cipher is a method of encrypting alphabetic text. It uses a simple form of polyalphabetic substitution. A polyalphabetic cipher is any cipher based on substitution, using multiple substitution alphabets. The encryption of the original text is done using the Vigenère square or Vigenère table.
- The table consists of the alphabets written out 26 times in different rows, each alphabet shifted cyclically to the left compared to the previous alphabet, corresponding to the 26 possible Caesar Ciphers.
- At different points in the encryption process, the cipher uses a different alphabet from one of the rows.
- The alphabet used at each point depends on a repeating keyword.
Example:
Input : Plaintext : GEEKSFORGEEKS
Keyword : AYUSH
Output : Ciphertext : GCYCZFMLYLEIM
For generating key, the given keyword is repeated
in a circular manner until it matches the length of
the plain text.
The keyword "AYUSH" generates the key "AYUSHAYUSHAYU"
The plain text is then encrypted using the process
explained below.
Encryption:
The first letter of the plaintext, G is paired with A, the first letter of the key. So use row G and column A of the Vigenère square, namely G. Similarly, for the second letter of the plaintext, the second letter of the key is used, the letter at row E, and column Y is C. The rest of the plaintext is enciphered in a similar fashion.
Table to encrypt – Geeks

Decryption:
Decryption is performed by going to the row in the table corresponding to the key, finding the position of the ciphertext letter in this row, and then using the column’s label as the plaintext. For example, in row A (from AYUSH), the ciphertext G appears in column G, which is the first plaintext letter. Next, we go to row Y (from AYUSH), locate the ciphertext C which is found in column E, thus E is the second plaintext letter.
A more easy implementation could be to visualize Vigenère algebraically by converting [A-Z] into numbers [0–25].
Encryption
The plaintext(P) and key(K) are added modulo 26.
Ei = (Pi + Ki) mod 26
Decryption
Di = (Ei - Ki) mod 26
Note: Di denotes the offset of the i-th character of the plaintext. Like offset of A is 0 and of B is 1 and so on.
Below is the implementation of the idea.
C++
#include<bits/stdc++.h>
using namespace std;
string generateKey(string str, string key)
{
int x = str.size();
for ( int i = 0; ; i++)
{
if (x == i)
i = 0;
if (key.size() == str.size())
break ;
key.push_back(key[i]);
}
return key;
}
string cipherText(string str, string key)
{
string cipher_text;
for ( int i = 0; i < str.size(); i++)
{
char x = (str[i] + key[i]) %26;
x += 'A' ;
cipher_text.push_back(x);
}
return cipher_text;
}
string originalText(string cipher_text, string key)
{
string orig_text;
for ( int i = 0 ; i < cipher_text.size(); i++)
{
char x = (cipher_text[i] - key[i] + 26) %26;
x += 'A' ;
orig_text.push_back(x);
}
return orig_text;
}
int main()
{
string str = "GEEKSFORGEEKS" ;
string keyword = "AYUSH" ;
string key = generateKey(str, keyword);
string cipher_text = cipherText(str, key);
cout << "Ciphertext : "
<< cipher_text << "\n" ;
cout << "Original/Decrypted Text : "
<< originalText(cipher_text, key);
return 0;
}
|
Java
class GFG
{
static String generateKey(String str, String key)
{
int x = str.length();
for ( int i = 0 ; ; i++)
{
if (x == i)
i = 0 ;
if (key.length() == str.length())
break ;
key+=(key.charAt(i));
}
return key;
}
static String cipherText(String str, String key)
{
String cipher_text= "" ;
for ( int i = 0 ; i < str.length(); i++)
{
int x = (str.charAt(i) + key.charAt(i)) % 26 ;
x += 'A' ;
cipher_text+=( char )(x);
}
return cipher_text;
}
static String originalText(String cipher_text, String key)
{
String orig_text= "" ;
for ( int i = 0 ; i < cipher_text.length() &&
i < key.length(); i++)
{
int x = (cipher_text.charAt(i) -
key.charAt(i) + 26 ) % 26 ;
x += 'A' ;
orig_text+=( char )(x);
}
return orig_text;
}
static String LowerToUpper(String s)
{
StringBuffer str = new StringBuffer(s);
for ( int i = 0 ; i < s.length(); i++)
{
if (Character.isLowerCase(s.charAt(i)))
{
str.setCharAt(i, Character.toUpperCase(s.charAt(i)));
}
}
s = str.toString();
return s;
}
public static void main(String[] args)
{
String Str = "GEEKSFORGEEKS" ;
String Keyword = "AYUSH" ;
String str = LowerToUpper(Str);
String keyword = LowerToUpper(Keyword);
String key = generateKey(str, keyword);
String cipher_text = cipherText(str, key);
System.out.println( "Ciphertext : "
+ cipher_text + "\n" );
System.out.println( "Original/Decrypted Text : "
+ originalText(cipher_text, key));
}
}
|
Python3
def generateKey(string, key):
key = list (key)
if len (string) = = len (key):
return (key)
else :
for i in range ( len (string) -
len (key)):
key.append(key[i % len (key)])
return ("" . join(key))
def cipherText(string, key):
cipher_text = []
for i in range ( len (string)):
x = ( ord (string[i]) +
ord (key[i])) % 26
x + = ord ( 'A' )
cipher_text.append( chr (x))
return ("" . join(cipher_text))
def originalText(cipher_text, key):
orig_text = []
for i in range ( len (cipher_text)):
x = ( ord (cipher_text[i]) -
ord (key[i]) + 26 ) % 26
x + = ord ( 'A' )
orig_text.append( chr (x))
return ("" . join(orig_text))
if __name__ = = "__main__" :
string = "GEEKSFORGEEKS"
keyword = "AYUSH"
key = generateKey(string, keyword)
cipher_text = cipherText(string,key)
print ( "Ciphertext :" , cipher_text)
print ( "Original/Decrypted Text :" ,
originalText(cipher_text, key))
|
C#
using System;
class GFG
{
static String generateKey(String str, String key)
{
int x = str.Length;
for ( int i = 0; ; i++)
{
if (x == i)
i = 0;
if (key.Length == str.Length)
break ;
key+=(key[i]);
}
return key;
}
static String cipherText(String str, String key)
{
String cipher_text= "" ;
for ( int i = 0; i < str.Length; i++)
{
int x = (str[i] + key[i]) %26;
x += 'A' ;
cipher_text+=( char )(x);
}
return cipher_text;
}
static String originalText(String cipher_text, String key)
{
String orig_text= "" ;
for ( int i = 0 ; i < cipher_text.Length &&
i < key.Length; i++)
{
int x = (cipher_text[i] -
key[i] + 26) %26;
x += 'A' ;
orig_text+=( char )(x);
}
return orig_text;
}
public static void Main(String[] args)
{
String str = "GEEKSFORGEEKS" ;
String keyword = "AYUSH" ;
String key = generateKey(str, keyword);
String cipher_text = cipherText(str, key);
Console.WriteLine( "Ciphertext : "
+ cipher_text + "\n" );
Console.WriteLine( "Original/Decrypted Text : "
+ originalText(cipher_text, key));
}
}
|
Javascript
<script>
function generateKey(str,key)
{
key=key.split( "" );
if (str.length == key.length)
return key.join( "" );
else
{
let temp=key.length;
for (let i = 0;i<(str.length-temp) ; i++)
{
key.push(key[i % ((key).length)])
}
}
return key.join( "" );
}
function cipherText(str,key)
{
let cipher_text= "" ;
for (let i = 0; i < str.length; i++)
{
let x = (str[i].charCodeAt(0) + key[i].charCodeAt(0)) %26;
x += 'A' .charCodeAt(0);
cipher_text+=String.fromCharCode(x);
}
return cipher_text;
}
function originalText(cipher_text,key)
{
let orig_text= "" ;
for (let i = 0 ; i < cipher_text.length ; i++)
{
let x = (cipher_text[i].charCodeAt(0) -
key[i].charCodeAt(0) + 26) %26;
x += 'A' .charCodeAt(0);
orig_text+=String.fromCharCode(x);
}
return orig_text;
}
function LowerToUpper(s)
{
let str =(s).split( "" );
for (let i = 0; i < s.length; i++)
{
if (s[i] == s[i].toLowerCase())
{
str[i] = s[i].toUpperCase();
}
}
s = str.toString();
return s;
}
let str = "GEEKSFORGEEKS" ;
let keyword = "AYUSH" ;
let key = generateKey(str, keyword);
let cipher_text = cipherText(str, key);
document.write( "Ciphertext : "
+ cipher_text + "<br><br>" );
document.write( "Original/Decrypted Text : "
+ originalText(cipher_text, key)+ "<br>" );
</script>
|
OutputCiphertext : GCYCZFMLYLEIM
Original/Decrypted Text : GEEKSFORGEEKS
Time Complexity : O(n), where n is the length of the string(here str).
Space Complexity :O(n), here n is the length of the string(here str).
This article is contributed by Ayush Khanduri. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.