Keyword Cipher


A keyword cipher is a form of monoalphabetic substitution. A keyword is used as the key, and it determines the letter matchings of the cipher alphabet to the plain alphabet. Repeats of letters in the word are removed, then the cipher alphabet is generated with the keyword matching to A, B, C etc. until the keyword is used up, whereupon the rest of the ciphertext letters are used in alphabetical order, excluding those already used in the key.

Encryption

First line of input contains keyword which you wish to enter. Second line of input contains the string which you have to encrypt.
Plaintext : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Encrypted : K R Y P T O S A B C D E F G H I J L M N Q U V W X Z



With KRYPTOS as the keyword, all As become Ks, all Bs become Rs and so on. Encrypting the message “knowledge is power” using the keyword “kryptos”:
Encrypting the message: Knowledge is Power
Encoded message: IlmWjbaEb gq NmWbp

Examples:

Input :
Keyword : secret
Message : Zombie Here
Output :
Ciphered String : ZLJEFT DTOT

Take the first example, we used "secret" keyword there.
Plain Text : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
When "secret" keyword is used, the new encypting text becomes :
Encrypting : S E C R T A B D F G H I J K L M N O P Q U V W X Y Z
This means 'A' means 'S', 'B' means 'E' and 'C' means 'C' and so on.
Lets encode the given message "Zombie Here"
ZOMBIE HERE becomes ZLJEFT DTOT

Input :
Keyword : Star War
Message : Attack at dawn
Output :
Ciphered String : SPPSAG SP RSVJ

Few points to be noted in this method:

  • All the messages are encoded in uppercase.
  • Whitespace, special character and numbers does not takes into consideration in keyword although you can put it in there.
  • While encrypting the message, whitespace, special characters and numbers remain unaffected.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program for encoding the string
// using classical cipher
  
#include<bits/stdc++.h>
using namespace std;
  
// Function generates the encoded text
string encoder(string key)
{
    string encoded = "";
    // This array represents the
    // 26 letters of alphabets
    bool arr[26] = {0};
  
    // This loop inserts the keyword
    // at the start of the encoded string
    for (int i=0; i<key.size(); i++)
    {
        if(key[i] >= 'A' && key[i] <= 'Z')
        {
            // To check whether the character is inserted
            // earlier in the encoded string or not
            if (arr[key[i]-65] == 0)
            {
                encoded += key[i];
                arr[key[i]-65] = 1;
            }
        }
        else if (key[i] >= 'a' && key[i] <= 'z')
        {
            if (arr[key[i]-97] == 0)
            {
                encoded += key[i] - 32;
                arr[key[i]-97] = 1;
            }
        }
    }
  
    // This loop inserts the remaining
    // characters in the encoded string.
    for (int i=0; i<26; i++)
    {
        if(arr[i] == 0)
        {
            arr[i]=1;
            encoded += char(i + 65);
        }
    }
    return encoded;
}
  
// Function that generates encodes(cipher) the message
string cipheredIt(string msg, string encoded)
{
    string cipher="";
  
    // This loop ciphered the message.
    // Spaces, special characters and numbers remain same.
    for (int i=0; i<msg.size(); i++)
    {
        if (msg[i] >='a' && msg[i] <='z')
        {
            int pos = msg[i] - 97;
            cipher += encoded[pos];
        }
        else if (msg[i] >='A' && msg[i] <='Z')
        {
            int pos = msg[i] - 65;
            cipher += encoded[pos];
        }
        else
        {
            cipher += msg[i];
        }
    }
    return cipher;
}
  
// Driver code
int main()
{
    // Hold the Keyword
    string key;
    key = "Computer";
    cout << "Keyword : " <<key << endl;
  
    // Function call to generate encoded text
    string encoded = encoder(key);
  
    // Message that need to encode
    string message = "GeeksforGeeks";
    cout << "Message before Ciphering : " << message << endl;
  
    // Function call to print ciphered text
    cout << "Ciphered Text : " << cipheredIt(message,encoded) << endl;
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for encoding the string
// using classical cipher
  
class GFG 
{
  
    // Function generates the encoded text
    static String encoder(char[] key) 
    {
        String encoded = "";
          
        // This array represents the
        // 26 letters of alphabets
        boolean[] arr = new boolean[26];
  
        // This loop inserts the keyword
        // at the start of the encoded string
        for (int i = 0; i < key.length; i++) 
        {
            if (key[i] >= 'A' && key[i] <= 'Z')
            {
                // To check whether the character is inserted
                // earlier in the encoded string or not
                if (arr[key[i] - 65] == false
                {
                    encoded += (char) key[i];
                    arr[key[i] - 65] = true;
                }
            
            else if (key[i] >= 'a' && key[i] <= 'z'
            {
                if (arr[key[i] - 97] == false)
                {
                    encoded += (char) (key[i] - 32);
                    arr[key[i] - 97] = true;
                }
            }
        }
  
        // This loop inserts the remaining
        // characters in the encoded string.
        for (int i = 0; i < 26; i++) 
        {
            if (arr[i] == false)
            {
                arr[i] = true;
                encoded += (char) (i + 65);
            }
        }
        return encoded;
    }
  
    // Function that generates encodes(cipher) the message
    static String cipheredIt(String msg, String encoded)
    {
        String cipher = "";
  
        // This loop ciphered the message.
        // Spaces, special characters and numbers remain same.
        for (int i = 0; i < msg.length(); i++)
        {
            if (msg.charAt(i) >= 'a' && msg.charAt(i) <= 'z')
            {
                int pos = msg.charAt(i) - 97;
                cipher += encoded.charAt(pos);
            }
            else if (msg.charAt(i) >= 'A' && msg.charAt(i) <= 'Z')
            {
                int pos = msg.charAt(i) - 65;
                cipher += encoded.charAt(pos);
            }
            else
            {
                cipher += msg.charAt(i);
            }
        }
        return cipher;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        // Hold the Keyword
        String key;
        key = "Computer";
        System.out.println("Keyword : " + key);
  
        // Function call to generate encoded text
        String encoded = encoder(key.toCharArray());
  
        // Message that need to encode
        String message = "GeeksforGeeks";
        System.out.println("Message before Ciphering : " + message);
  
        // Function call to print ciphered text
        System.out.println("Ciphered Text : " + cipheredIt(message,
                encoded));
    }
}
  
// This code is contributed by 29AjayKumar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for encoding the string
// using classical cipher
using System;
      
class GFG 
{
  
    // Function generates the encoded text
    static String encoder(char[] key) 
    {
        String encoded = "";
          
        // This array represents the
        // 26 letters of alphabets
        Boolean[] arr = new Boolean[26];
  
        // This loop inserts the keyword
        // at the start of the encoded string
        for (int i = 0; i < key.Length; i++) 
        {
            if (key[i] >= 'A' && key[i] <= 'Z')
            {
                // To check whether the character is inserted
                // earlier in the encoded string or not
                if (arr[key[i] - 65] == false
                {
                    encoded += (char) key[i];
                    arr[key[i] - 65] = true;
                }
            
            else if (key[i] >= 'a' && key[i] <= 'z'
            {
                if (arr[key[i] - 97] == false)
                {
                    encoded += (char) (key[i] - 32);
                    arr[key[i] - 97] = true;
                }
            }
        }
  
        // This loop inserts the remaining
        // characters in the encoded string.
        for (int i = 0; i < 26; i++) 
        {
            if (arr[i] == false)
            {
                arr[i] = true;
                encoded += (char) (i + 65);
            }
        }
        return encoded;
    }
  
    // Function that generates encodes(cipher) the message
    static String cipheredIt(String msg, String encoded)
    {
        String cipher = "";
  
        // This loop ciphered the message.
        // Spaces, special characters and numbers remain same.
        for (int i = 0; i < msg.Length; i++)
        {
            if (msg[i] >= 'a' && msg[i] <= 'z')
            {
                int pos = msg[i] - 97;
                cipher += encoded[pos];
            }
            else if (msg[i] >= 'A' && msg[i] <= 'Z')
            {
                int pos = msg[i] - 65;
                cipher += encoded[pos];
            }
            else
            {
                cipher += msg[i];
            }
        }
        return cipher;
    }
  
    // Driver code
    public static void Main(String[] args)
    {
        // Hold the Keyword
        String key;
        key = "Computer";
        Console.WriteLine("Keyword : " + key);
  
        // Function call to generate encoded text
        String encoded = encoder(key.ToCharArray());
  
        // Message that need to encode
        String message = "GeeksforGeeks";
        Console.WriteLine("Message before Ciphering : " + message);
  
        // Function call to print ciphered text
        Console.WriteLine("Ciphered Text : " + cipheredIt(message,
                encoded));
    }
}
  
/* This code contributed by PrinciRaj1992 */

chevron_right




Output:

Keyword : Computer
Message before Ciphering : GeeksforGeeks
Ciphered Text : EUUDNTILEUUDN

Decryption

To decode the message you check the position of given message in encrypting text with the plain text.

Plaintext : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Encrypted : K R Y P T O S A B C D E F G H I J L M N Q U V W X Z

Message : PTYBIATLEP
Deciphered Text : DECIPHERED

Now, how we generate the deciphered string?
We search for ‘P’ in Encrypted Text and compare its position with plain text letter and generate that letter. So ‘P’ becomes ‘D’, ‘T’ becomes ‘E’, ‘Y’ becomes ‘C’ and so on.

Examples:


Input :
Keyword : secret
Message : zljeft dtOT
Output :
Deciphered String : ZOMBIE HERE

Input :
Keyword : joker0O7hack123
Message : QjTijl
Output :
Deciphered String : BATMAN
filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program for decoding the string
// which generate using classical cipher
  
#include<bits/stdc++.h>
using namespace std;
  
// Original Set of letters
string plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  
// Function generates the encoded text
string encoder(string key)
{
    string encoded = "";
    bool arr[26] = {0};
  
    // This loop inserts the keyword
    // at the start of the encoded string
    for (int i=0; i<key.size(); i++)
    {
        if(key[i] >= 'A' && key[i] <= 'Z')
        {
            // To check whether the character is inserted
            // earlier in the encoded string or not
            if (arr[key[i]-65] == 0)
            {
                encoded += key[i];
                arr[key[i]-65] = 1;
            }
        }
        else if (key[i] >= 'a' && key[i] <= 'z')
        {
            if (arr[key[i]-97] == 0)
            {
                encoded += key[i] - 32;
                arr[key[i]-97] = 1;
            }
        }
    }
  
    // This loop inserts the remaining
    // characters in the encoded string.
    for (int i=0; i<26; i++)
    {
        if(arr[i] == 0)
        {
            arr[i]=1;
            encoded += char(i + 65);
        }
    }
    return encoded;
}
  
// This function will decode the message
string decipheredIt(string msg, string encoded)
{
    // Hold the position of every character (A-Z)
    // from encoded string
    map <char,int> enc;
    for(int i=0; i<encoded.size(); i++)
    {
        enc[encoded[i]]=i;
    }
  
    string decipher="";
  
    // This loop deciphered the message.
    // Spaces, special characters and numbers remain same.
    for (int i=0; i<msg.size(); i++)
    {
        if (msg[i] >='a' && msg[i] <='z')
        {
            int pos = enc[msg[i]-32];
            decipher += plaintext[pos];
        }
        else if(msg[i] >='A' && msg[i] <='Z')
        {
            int pos = enc[msg[i]];
            decipher += plaintext[pos];
        }
        else
        {
            decipher += msg[i];
        }
    }
    return decipher;
}
  
// Driver code
int main()
{
    // Hold the Keyword
    string key;
    key = "Computer";
    cout << "Keyword : "<< key << endl;
  
    // Function call to generate encoded text
    string encoded = encoder(key);
  
    // Message that need to decode
    string message = "EUUDN TIL EUUDN";
    cout << "Message before Deciphering : " << message << endl;
  
    // Function call to print deciphered text
    cout << "Deciphered Text : " << decipheredIt(message,encoded) << endl;
  
    return 0;
}

chevron_right


Output:

Keyword : Computer
Message before Deciphering : EUUDN TIL EUUDN
Deciphered Text : GEEKS FOR GEEKS

You can improve this Classical Cipher : Keyword also. Here we are only taking A-Z in plain text. You can take uppercase,lowercase and numbers also into consideration.

Ways to attack a keyword cipher : The best ways to attack a keyword cipher without knowing
the keyword are through known – plaintext attack, frequency analysis and discovery of the keyword (often a cryptanalyst will combine all three techniques). Keyword discovery allows immediate decryption since the table can be made immediately.

This article is contributed by Sachin Bisht. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up

Improved By : 29AjayKumar, princiraj1992



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.