Instructions
Requirements and Specifications
Source Code
/*=============================================================================
| Assignment: pa01 - Encrypting a plaintext file using the Vigenere cipher
|
| Author: Your name here
| Language: Java
|
| To Compile: javac pa01.java
|
| To Execute: java -> java pa01 kX.txt pX.txt
| where kX.txt is the keytext file
| and pX.txt is plaintext file
|
| Note: All input files are simple 8 bit ASCII input
|
| Class: CIS3360 - Security in Computing - Summer 2021
| Instructor: McAlpin
| Due Date: per assignment
|
+=============================================================================*/
import java.io.BufferedReader;
import java.io.FileReader;
public class pa01 {
public static void main(String[] args) throws Exception {
// check number of argumnts
if(args.length < 2)
{
System.out.println("You must provide at least two arguments.");
System.exit(1);
}
// Get name of file with encryption key
String file1 = args[0];
// Get name of file to encrypt
String file2 = args[1];
// Read files
String keyword = "";
String plain_text = "";
int i;
try
{
BufferedReader reader = new BufferedReader(new FileReader(file1));
while((i = reader.read()) != -1)
{
char ch = (char)i;
// convert to lowercase
ch = Character.toLowerCase(ch);
// only use characters that are in the alphabet a-z
if((int)ch >= (int)('a') && (int)ch <= (int)('z'))
keyword += ch;
}
reader.close();
}
catch(Exception e)
{
System.out.println("Could not load keyword file " + file1 + ".");
e.printStackTrace();
}
try
{
BufferedReader reader = new BufferedReader(new FileReader(file2));
while((i = reader.read()) != -1)
plain_text += (char)i;
reader.close();
}
catch(Exception e)
{
System.out.println("Could not load text file " + file2 + ".");
e.printStackTrace();
}
char[][] table = create_table();
String key = generate_key(keyword, plain_text);
String encrypted = encrypt(plain_text, key, table);
String decrypted = decrypt(encrypted, key, table);
System.out.println("Encrypted text: " + encrypted);
System.out.println("");
System.out.println("Original/Decrypted text: " + decrypted);
}
static String encrypt(String text, String key, char[][] table)
{
// index of the starting letter
int start = 'a';
// cpy the text and convert to lower
String text_copy = text.toLowerCase();
// variable to store the encrypted text
String encrypted = "";
int row, col;
char encrypted_ch;
int i = 0;
for(char ch: text_copy.toCharArray())
{
// check if the character is in the alphabet
if((int)ch < (int)('a') || (int)ch > (int)('z'))
{
encrypted += ch;
continue;
}
// get index of row in table
row = ch - start;
col = key.charAt(i) - start;
encrypted_ch = table[row][col];
encrypted += encrypted_ch;
i++;
}
return encrypted;
}
static String decrypt(String text, String key, char[][] table)
{
// index of the starting letter
int start = 'a';
// cpy the text and convert to lower
String text_copy = text.toLowerCase();
// variable to store the decrypted text
String decrypted = "";
int row, col = 0;
char decrypted_ch;
int i = 0;
for(char ch: text_copy.toCharArray())
{
// check if the character is in the alphabet
if((int)ch < (int)('a') || (int)ch > (int)('z'))
{
decrypted += ch;
continue;
}
// get index of row in table
row = key.charAt(i) - start;
// now, in this row, check in which column the letter of the encrypted text appears
for(int j = 0; j < 26; j++)
{
if(table[row][j] == ch)
{
col = j;
break;
}
}
decrypted_ch = (char)(col+start);
decrypted += decrypted_ch;
i++;
}
return decrypted;
}
static String generate_key(String keyword, String text)
{
// get length of text to encrypt
int N = text.length();
// Generate the key by repeating keyword until its length is higher than N
int keyword_N = keyword.length();
String key = keyword;
while(keyword_N < N)
{
key += keyword;
keyword_N = key.length();
}
// Now, cut the given key so the length is equal to N
key = key.substring(0, N);
return key.toLowerCase();
}
static char[][] create_table()
{
/*
This function will create the Vigenere Table
*/
char[][] table = new char[26][26];
int start = 'a';
int ch = start;
for(int i = 0; i < 26; i++)
{
ch = start+i;
for(int j = 0; j < 26; j++)
{
table[i][j] = (char)ch;
ch++;
if(ch > (int)('z'))
ch = 'a';
}
}
return table;
}
}
/*=============================================================================
| I [your name] ([your NID]) affirm that this program is
| entirely my own work and that I have neither developed my code together with
| any another person, nor copied any code from any other person, nor permitted
| my code to be copied or otherwise used by any other person, nor have I
| copied, modified, or otherwise used programs created by others. I acknowledge
| that any violation of the above terms will be treated as academic dishonesty.
+=============================================================================*/