TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
vigenere_cipher.cpp File Reference

Implementation of Vigenère cipher algorithm. More...

#include <iostream>
#include <string>
#include <cassert>
Include dependency graph for vigenere_cipher.cpp:

Go to the source code of this file.

Namespaces

namespace  ciphers
 Algorithms for encryption and decryption.
 
namespace  vigenere
 Functions for vigenère cipher algorithm.
 

Functions

std::string ciphers::vigenere::encrypt (const std::string &text, const std::string &key)
 
std::string ciphers::vigenere::decrypt (const std::string &text, const std::string &key)
 
void test ()
 
int main ()
 

Detailed Description

Implementation of Vigenère cipher algorithm.

The Vigenère cipher is a method of encrypting alphabetic text by using a series of interwoven vigenere ciphers, based on the letters of a keyword. It employs a form of polyalphabetic substitution.

Algorithm

The encryption can also be represented using modular arithmetic by first transforming the letters into numbers, according to the scheme, A → 0, B → 1, ..., Z → 25. Encryption of \(i^{th}\) character in Message M by key K can be described mathematically as,

\[ E_{K}(M_{i}) = (M_{i} + K_{i})\;\mbox{mod}\; 26\]

while decryption of \(i^{th}\) character in Cipher C by key K can be described mathematically as,

\[ D_{k}(C_{i}) = (C_{i} - K_{i} + 26)\;\mbox{mod}\; 26\]

Where \(K_{i}\) denotes corresponding character in key. If \(|key| < |text|\) than same key is repeated untill their lengths are equal.

For Example, If M = "ATTACKATDAWN" and K = "LEMON" than K becomes "LEMONLEMONLE".

Note
Rather than creating new key of equal length this program does this by using modular index for key (i.e. \((j + 1) \;\mbox{mod}\; |\mbox{key}|\))
This program implements Vigenère cipher for only uppercase English alphabet characters (i.e. A-Z).
Author
Deep Raval

Definition in file vigenere_cipher.cpp.

Function Documentation

◆ decrypt()

std::string ciphers::vigenere::decrypt ( const std::string & text,
const std::string & key )

Decrypt given text using vigenere cipher.

Parameters
texttext to be decrypted
keykey to be used for decryption
Returns
new decrypted text

Definition at line 92 of file vigenere_cipher.cpp.

92 {
93 // Going through each character of text and key
94 // Note that key is visited in circular way hence j = (j + 1) % |key|
95 std::string decrypted_text = ""; // Empty string to store decrypted text
96 for(size_t i = 0, j = 0; i < text.length(); i++, j = (j + 1) % key.length()) {
97 int place_value_text = get_value(text[i]); // Getting value of character in text
98 int place_value_key = get_value(key[j]); // Getting value of character in key
99 place_value_text = (place_value_text - place_value_key + 26) % 26; // Applying decryption
100 char decrypted_char = get_char(place_value_text); // Getting new character from decrypted value
101 decrypted_text += decrypted_char; // Appending decrypted character
102 }
103 return decrypted_text; // Returning decrypted text
104 }
char get_char(const std::string &input, std::size_t pos)
Returns the character at pos after the input is padded.
Definition sha256.cpp:170

◆ encrypt()

std::string ciphers::vigenere::encrypt ( const std::string & text,
const std::string & key )

Encrypt given text using vigenere cipher.

Parameters
texttext to be encrypted
keyto be used for encryption
Returns
new encrypted text

Definition at line 73 of file vigenere_cipher.cpp.

73 {
74 std::string encrypted_text = ""; // Empty string to store encrypted text
75 // Going through each character of text and key
76 // Note that key is visited in circular way hence j = (j + 1) % |key|
77 for(size_t i = 0, j = 0; i < text.length(); i++, j = (j + 1) % key.length()) {
78 int place_value_text = get_value(text[i]); // Getting value of character in text
79 int place_value_key = get_value(key[j]); // Getting value of character in key
80 place_value_text = (place_value_text + place_value_key) % 26; // Applying encryption
81 char encrypted_char = get_char(place_value_text); // Getting new character from encrypted value
82 encrypted_text += encrypted_char; // Appending encrypted character
83 }
84 return encrypted_text; // Returning encrypted text
85 }

◆ main()

int main ( void )

Driver Code

Definition at line 131 of file vigenere_cipher.cpp.

131 {
132 // Testing
133 test();
134 return 0;
135}
void test()

◆ test()

void test ( )

Function to test above algorithm

Definition at line 111 of file vigenere_cipher.cpp.

111 {
112 // Test 1
113 std::string text1 = "NIKOLATESLA";
114 std::string encrypted1 = ciphers::vigenere::encrypt(text1, "TESLA");
115 std::string decrypted1 = ciphers::vigenere::decrypt(encrypted1, "TESLA");
116 assert(text1 == decrypted1);
117 std::cout << "Original text : " << text1;
118 std::cout << " , Encrypted text (with key = TESLA) : " << encrypted1;
119 std::cout << " , Decrypted text : "<< decrypted1 << std::endl;
120 // Test 2
121 std::string text2 = "GOOGLEIT";
122 std::string encrypted2 = ciphers::vigenere::encrypt(text2, "REALLY");
123 std::string decrypted2 = ciphers::vigenere::decrypt(encrypted2, "REALLY");
124 assert(text2 == decrypted2);
125 std::cout << "Original text : " << text2;
126 std::cout << " , Encrypted text (with key = REALLY) : " << encrypted2;
127 std::cout << " , Decrypted text : "<< decrypted2 << std::endl;
128}
std::string decrypt(const std::string &text, const std::string &key)
std::string encrypt(const std::string &text, const std::string &key)