Search code examples
javaencryptioncaesar-cipher

Julius Casear Decyption/Encryption, Encoding/Decoding Java Program


So in my program I am supposed to have a driver class and utility class. I have to write a program that uses the same type of Cryptography as Caesar did. For example a = f, b = g, c = h, and so on. In my driver class is where I am supposed to have the decoding and encoding process. The file has to be encrypted/decrypted using command line arguments. For example,

java CaesarLab encode "keyword" message.txt

In the utility class is where the shifting of letters should be. This is where I know to put this code:

public static final int NUM_LETTERS = 26;

// shifting up for the encoding process
public static char shiftUpByK(char c, int k) {
   if ('a' <= c && c <= 'z')
       return (char) ('a' + (c - 'a' + k) % NUM_LETTERS);
   if ('A' <= c && c <= 'Z')
       return (char) ('A' + (c-'A' + k) % NUM_LETTERS);
   return c; // don't encrypt if not an alphabetic character
}

 // shifting down for the decoding process
 public static char shiftDownByK(char c, int k) {
     return shiftUpByK(c, NUM_LETTERS - k);
}

It should also read from a FileInputStream, and handle exception/errors by catching all I/O exceptions.

There seems to be a lot of components to this program and I am having trouble putting it all together. If i could get some help in sorting all of this out, it would be greatly appreciated.


Solution

  • I made a little Skeleton for you to have a specific idea what those "many components" could be. You already have your driver - let's say you defined it in CaesarDriver.java.

    A Utility using that "driver" could now look something like this:

    import java.io.PrintWriter;
    import java.util.Scanner;
    
    /**
     * This is a utility class allows to encrypt/ decrypt the data received by a Scanner {@see Scanner} using the caesar
     * encoding by providing the key to be used.
     *
     * Note: Behind the scanner there may be a File or System.in as source
     */
    public class CaesarUtility {
    
        /**
         * TODO: implement a mechanism to encrypt data ({@see Scanner}) and write the encrypted data out ({@see PrintWriter})
         * TODO: use the provided key for encryption
         * @param in source for the data to be encrypted {@see Scanner}
         * @param out destination for the encrypted data to be written to {@see PrintWriter}
         * @param key key to be used for the encryption
         */
        public static void encrypt (Scanner in, PrintWriter out, String key){
    
            // TODO: do we need to validate something? Could something be null? Do we need to care about this?
    
            // TODO: Read from Scanner
            String dataToEncrypt = "TODO: Read from Scanner";
    
            // TODO: Encryption
            String encryptedData = "Use your existing Caesar Driver with the correct method to encrypt the data";
    
            // TODO: Write encrpyted data using the provided PrintWriter
        }
    
        /**
         * TODO: The same like in encrypt but decrypt data this time
         * @param in source for the data to be decrypted {@see Scanner}
         * @param out destination for the decrypted data to be written to {@see PrintWriter}
         * @param key key to be used for the decryption
         */
        public static void decrypt (Scanner in, PrintWriter out, String key){
    
            // TODO: Basicially the same but for decryption (e.g. you will use your driver slightly different here :))
    
        }
    }
    

    Allowing the world to be used something like this:

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.PrintWriter;
    import java.util.Scanner;
    
    /**
     *  Hello i am a Application that is too lazy to implement the Caesar encoding/ decoding - luckaly someone
     *  made me a Utility for that :)
     *
     *  TODO: This could need some improvement - maybe let the user type in the in/output file in the console?
     *
     */
    public class Application {
    
        // TODO: How i said i am a bit rosty here - was it a number or a character - you know it better than i do i assume :)
        private static final String KEY = "???";
    
        public static void main(String[] args){
              new Application().start();
        }
    
        public void start(){
    
             // lets first encode a file - we need to have a Scanner to be able to use the Utility class (so i searched)
             // SO for "Java Scanner read File" and found this:
            File inputFile = new File("sensitive-data.txt");
            Scanner inputScanner = null;
    
            try {
                new Scanner(inputFile);
            } catch (FileNotFoundException e) {
                // TODO: Exception handling (does it make sence to proceed in this case? do we have to notify the user about this?
                e.printStackTrace();
            }
    
            // let the utility encode the file and write it to another file - luckaly searching SO for "Java PrintWriter example"
            // helps us out here
            File outFile = new File ("sensitive-data.txt");
            PrintWriter outWriter = null;
            try {
                outWriter = new PrintWriter (outFile);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
    
            // Alright we have both - the input as well as the output and the key - its time to let the utility do its work
            CaesarUtility.encrypt(inputScanner, outWriter, KEY);
    
            // TODO: Whoopy i accidentially overwritten the source file with encoded data - luckaly i am able to decode it again
            // TODO: Decode the encoded file before the boss asks about the next sensitive-data report :)
    
        }
    }
    

    I hope this supports you in further digging into the task - feel free to update your answer with all of your code when you're stuck next time (it will at least allow you to ask more specific from now on so you dont get downvoted to the ground).