Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

Java Program to Implement the One Time Pad Algorithm

  • Difficulty Level : Medium
  • Last Updated : 20 Dec, 2021

One Time Pad algorithm is also known as Vernam Cipher. It is a method of encrypting alphabetic plain text. It is one of the Substitution techniques which converts plain text into ciphertext. In this mechanism, we assign a number to each character of the Plain-Text.

The assignment is as follows: 

ABCDEFGHIJ
0123456789
KLMNOPQRST
10111213141516171819
UVWXYZ
202122232425

The relation between the key and plain text: In this algorithm, the length of the key should be equal to that of plain text.

Illustrations:

Input:  plain text - HELLO
        Key - MONEY
Output: Cipher - TSYPM
        Message - HELLO
Input:  plain text - SAVE
        Key - LIFE  
Output: Cipher - DIAI        
        Message - SAVE

Outputs explanation: 

Part 1: Plain text to ciphertext

Plain text — H E L L O → 7 4 11 11 14
Key — M O N E Y → 12 14 13 4 24
Plain text + key → 19 18 24 15 38 
                 → 19 18 24 15 12 (=38 – 26)

Cipher Text → T S Y P M

Part 2: Ciphertext to Message

Cipher Text — T S Y P M → 19 18 24 15 12
Key — M O N E Y→ 12 14 13 4 24
Cipher text - key → 7 4 11 11 -12
                  → 7 4 11 11 14

Message → H E L L O

Example  

Java




// Java program Implementing One Time Pad Algorithm
 
// Importing required classes
import java.io.*;
 
// Main class
public class GFG {
 
    // Method 1
    // Returning encrypted text
    public static String stringEncryption(String text,
                                          String key)
    {
 
        // Initializing cipherText
        String cipherText = "";
 
        // Initialize cipher array of key length
        // which stores the sum of corresponding no.'s
        // of plainText and key.
        int cipher[] = new int[key.length()];
 
        for (int i = 0; i < key.length(); i++) {
            cipher[i] = text.charAt(i) - 'A' + key.charAt(i)
                        - 'A';
        }
 
        // If the sum is greater than 25 subtract 26 from it
        //  and store that resulting value
        for (int i = 0; i < key.length(); i++) {
            if (cipher[i] > 25) {
                cipher[i] = cipher[i] - 26;
            }
        }
 
        // Converting the no.'s into integers
 
        // Convert these integers to corresponding
        // characters and add them up to cipherText
        for (int i = 0; i < key.length(); i++) {
            int x = cipher[i] + 'A';
            cipherText += (char)x;
        }
 
        // Returning the cipherText
        return cipherText;
    }
 
    // Method 2
    // Returning plain text
    public static String stringDecryption(String s,
                                          String key)
    {
        // Initializing plain text
        String plainText = "";
 
        // Initializing integer array of key length
        // which stores difference of corresponding no.'s of
        // each character of cipherText and key
        int plain[] = new int[key.length()];
 
        // Running for loop for each character
        // subtracting and storing in the array
        for (int i = 0; i < key.length(); i++) {
            plain[i]
                = s.charAt(i) - 'A' - (key.charAt(i) - 'A');
        }
 
        // If the difference is less than 0
        // add 26 and store it in the array.
        for (int i = 0; i < key.length(); i++) {
            if (plain[i] < 0) {
                plain[i] = plain[i] + 26;
            }
        }
 
        // Converting int to corresponding char
        // add them up to plainText
        for (int i = 0; i < key.length(); i++) {
            int x = plain[i] + 'A';
            plainText += (char)x;
        }
 
        // Returning plainText
        return plainText;
    }
 
    // Method 3
    // Main driver method
    public static void main(String[] args)
    {
        // Declaring plain text
        String plainText = "Hello";
 
        // Declaring key
        String key = "MONEY";
 
        // Converting plain text to toUpperCase
        // function call to stringEncryption
        // with plainText and key as parameters
        String encryptedText = stringEncryption(
            plainText.toUpperCase(), key.toUpperCase());
 
        // Printing cipher Text
        System.out.println("Cipher Text - "
                           + encryptedText);
 
        // Calling above method to stringDecryption
        // with encryptedText and key as parameters
        System.out.println(
            "Message - "
            + stringDecryption(encryptedText,
                               key.toUpperCase()));
    }
}
Output
Cipher Text - TSYPM
Message - HELLO


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!