user3382405
user3382405

Reputation: 33

How to create a substitution keyword cipher

I am trying to develop a substitution cipher that uses a keyword to create a new cipher alphabet. I am new to Java (as I'm sure you will be able to tell!) and I am finding it hard to wrap my head around the code for what I need to do.

My understanding is as follows:

If for example, the keyword is javben, I should start by finding the index of the "j" in the plainText string array, which is 9. I then want to shift the plainText[9] into cipherText[0] and move each other element over by 1. So the first pass of this would result in:

cipherText[] = {"j","a","b","c","d","e","f","g","h","i","k","l","m","n","o","p","q","r","s","t","u","v","w","r","x","y","z"}

Then I would find the "a" and it's it's already where it should be so I'll need to account for this and not shift it -- somehow. The next character is the "v" and so the process would continue.

After shifting everything in the cipher I should end up with:

plainText []= {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","r","x","y","z"}
cipherText[]= {"j","a","v","b","e","n","c","d","f","g","h","i","k","l","m","o","p","q","r","s","t","u","w","r","x","y","z"}

As you can see, I am reasonably sure that I understand the process of which to go through, however I am really struggling wrap my head around the code required for this. Help please!

import java.util.Scanner;
import java.io.*;
/**
* This program uses a keyword for a simple substitution cipher.
* 
* @author Bryan
* @version Programming Project
*/

public class Cipher
{
// The main method removes duplicate characters in a word input by the user.
public static void main(String[] args) throws IOException
{
    // Creatae a new scanner object for keyboard input
    Scanner keyboard = new Scanner(System.in);

    // prompt the user to enter a word
    System.out.println("Please enter your keyword: ");
    // and get their input
    String input = keyboard.nextLine();
    // the keyword will be built up here
    String keyword = "";

    while(input.length() > 0) 
    {
        // get the first letter
        char letter = input.charAt(0);
        // if the letter is not already in the output
        if (keyword.indexOf(letter) == -1)
        {
            // add it to the end
            keyword = keyword + letter;
        }

        // that letter is processed : discard it
        input = input.substring(1);
    }

    //this is just to confirm the duplicate letters in the keyword are removed
    System.out.println(keyword); 
    getFile();

}

/**
 * This asks the user to specify a filename which is then 
 * read into the program for enciphering
 */

public static void getFile()throws IOException
{
    // Creatae a new scanner object for keyboard input
    Scanner keyboard = new Scanner(System.in);

    // Get the file name
    System.out.println("Enter the file name: ");
    String filename = keyboard.nextLine();

    //Open the file
    File file = new File(filename);
    Scanner inputFile = new Scanner(file);

    // Read the lines from the file until no more are left
    while (inputFile.hasNext())
    {
        //Read the next line
        String allText = inputFile.nextLine();

        // Display the text
        System.out.println(allText);
    }




    //Close the file
    inputFile.close();

}

public static void alphabet()
{
    String[] 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"};
    String[] cipherText = {"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"};
}
}

Upvotes: 2

Views: 17527

Answers (3)

y3sm3
y3sm3

Reputation: 11

package Classes;

public class SubstitutionCipherClass {

    public static void main(String[] args) {
        char plainText[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'r', 'x', 'y', 'z'};
        char cipherText[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'r', 'x', 'y', 'z'};

        String pt = "haci";

        for (int a = 0; a < pt.length(); a++) {
            for (int i = 0; i < plainText.length; i++) {
               if(plainText[i] == (pt.charAt(a))){
                   System.out.println(cipherText[i]);
               }
            }
        }
    }
}

Upvotes: 1

Kishor N R
Kishor N R

Reputation: 1591

I have done substitution cipher using following code

import java.util.*;

class SubCipher
{

public static void main(String args[])
{
     String plainText = ",.<>;':\"[]{}-=_+)(*&^%$#\"@!),998683,1,x3x33,10~1,1,10~2,2,20";
    String strcipherText = Encrypt(plainText);
    String strdecryptedText = Decrypt(strcipherText);

System.out.println("Plain Text :"+plainText);
System.out.println("Encrypted Text :"+strcipherText);
System.out.println("Decrypted Text :"+strdecryptedText);     
}

private static String Encrypt(String text)
{
    byte[] textBytes = text.getBytes();
    for (int i = 0; i < textBytes.length; i++)
    {
        int currentByteValue = (int)textBytes[i];
        textBytes[i] = (byte)(currentByteValue > 255 ? currentByteValue - 255 + 2 : currentByteValue + 2);
    }
    String strbyte=new String(textBytes);
    return  strbyte;
}

private static String Decrypt(String text)
{
    byte[] textBytes = text.getBytes();
    for (int i = 0; i < textBytes.length; i++)
    {
        int currentByteValue = (int)textBytes[i];
        textBytes[i] = (byte)(currentByteValue < 0 ? currentByteValue + 255 - 2 : currentByteValue - 2);
    }
    String strbyte=new String(textBytes);
    return strbyte;
   }
}

Upvotes: 0

Basim Khajwal
Basim Khajwal

Reputation: 936

This one is quite simple, just set up a function that for every letter in the key word it just takes it out of the alphabet array and then add the two arrays together with the array of letters at the beginning and the alphabet without those letters after it. E.g:

String[] cipherKeyWord(String keyWord, String[] alphabet){
    ArrayList<String> finalCipher = (ArrayList) Arrays.asList(keyWord.split("(?!^)")); 
    //^ This splits it into a string of every word using regular expressions

    ArrayList<String> newAlphabet = (ArrayList) Arrays.asList(alphabet);

    newAlphabet.removeAll(finalCipher);

    finalCipher.addAll(newAlphabet);

    return finalCipher.toArray(new String[finalCipher.size()]);
}

Upvotes: 1

Related Questions