Skip to content

Update Caesar.java #412

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 12, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
240 changes: 127 additions & 113 deletions ciphers/Caesar.java
Original file line number Diff line number Diff line change
@@ -1,117 +1,131 @@
/**
Author : FAHRI YARDIMCI
package ciphers;

A Java implementation of Caesar Cipher.
/It is a type of substitution cipher in which each letter in the plaintext is replaced by a letter some fixed number of positions down the alphabet. /
**/
import java.util.Scanner;

/**
*
* A Java implementation of Caesar Cipher. /It is a type of substitution cipher
* in which each letter in the plaintext is replaced by a letter some fixed
* number of positions down the alphabet. /
*
* @author FAHRI YARDIMCI
* @author khalil2535
*/
public class Caesar {
public static String encode (String message,int shift)
{
String encoded = "";
for(int i = 0 ; i<message.length() ;i++)
{
int current = message.charAt(i); //using char to shift characters because ascii is in-order latin alphabet
if(current==32)
{
encoded += " ";
continue;

}
else if (current>=65 && current<= 90)
{
int numAlphabet = message.charAt(i);
if(shift + numAlphabet > 90)
{
int j = 90 - numAlphabet;
char nextKey = (char)(65 + (shift - j - 1));
encoded += nextKey;

}
else
{
char nextKey = (char)(current + shift);
encoded += nextKey;
}
}
else if (current>=97 && current <= 122)
{
int numAlphabet = message.charAt(i);
if(shift + numAlphabet > 122)
{
int j = 122 - numAlphabet;
char nextKey = (char)(97 + (shift - j - 1));
encoded += nextKey;
}
else
{
char nextKey = (char)(current + shift);
encoded += nextKey;
}
}
}
return encoded;
}
public static String decode (String message,int shift)
{
String decoded = "";
for(int i = 0 ; i<message.length() ;i++)
{
int current = message.charAt(i);
if(current==32)
{
decoded += " ";
continue;

}
else if (current>=65 && current<= 90)
{
int numAlphabet = message.charAt(i);
if(numAlphabet - shift < 65)
{
int j = numAlphabet - 65;
char nextKey = (char)(90 - (shift - j - 1));
decoded += nextKey;

}
else
{
char nextKey = (char)(current - shift);
decoded += nextKey;
}
}
else if (current>=97 && current <= 122)
{
int numAlphabet = message.charAt(i);
if(numAlphabet - shift < 97)
{
int j = numAlphabet - 97;
char nextKey = (char)(122 - (shift - j - 1));
decoded += nextKey;
}
else
{
char nextKey = (char)(current - shift);
decoded += nextKey;
}
}
}
return decoded;
}
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
System.out.println("Please enter the message (Latin Alphabet)");
String message = input.nextLine();
System.out.println(message);
System.out.println("Please enter the shift number");
int shift = input.nextInt() % 26;
System.out.println("(E)ncode or (D)ecode ?");
char choice = input.next().charAt(0);
if(choice == 'E' || choice=='e')
System.out.println("ENCODED MESSAGE IS \n" + encode(message,shift)); //send our function to handle
if(choice =='D' || choice =='d')
System.out.println("DECODED MESSAGE IS \n" + decode(message,shift));
}

}
/**
* Encrypt text by shifting every Latin char by add number shift for ASCII
* Example : A + 1 -> B
*
* @param message
* @param shift
* @return Encrypted message
*/
public static String encode(String message, int shift) {
String encoded = "";

while (shift >= 26) { // 26 = number of latin letters
shift -= 26;
}

final int length = message.length();
for (int i = 0; i < length; i++) {

// int current = message.charAt(i); //using char to shift characters because ascii is in-order latin alphabet
char current = message.charAt(i); // Java law : char + int = char

if (IsCapitalLatinLetter(current)) {

current += shift;
encoded += (char) (current > 'Z' ? current - 26 : current); // 26 = number of latin letters

} else if (IsSmallLatinLetter(current)) {

current += shift;
encoded += (char) (current > 'z' ? current - 26 : current); // 26 = number of latin letters

} else {
encoded += current;
}
}
return encoded;
}

/**
* Decrypt message by shifting back every Latin char to previous the ASCII
* Example : B - 1 -> A
*
* @param encryptedMessage
* @param shift
* @return message
*/
public static String decode(String encryptedMessage, int shift) {
String decoded = "";

while (shift >= 26) { // 26 = number of latin letters
shift -= 26;
}

final int length = encryptedMessage.length();
for (int i = 0; i < length; i++) {
char current = encryptedMessage.charAt(i);
if (IsCapitalLatinLetter(current)) {

current -= shift;
decoded += (char) (current < 'A' ? current + 26 : current);// 26 = number of latin letters

} else if (IsSmallLatinLetter(current)) {

current -= shift;
decoded += (char) (current < 'a' ? current + 26 : current);// 26 = number of latin letters

} else {
decoded += current;
}
}
return decoded;
}

/**
*
* @param c
* @return true if character is capital Latin letter or false for others
*/
private static boolean IsCapitalLatinLetter(char c) {
return c >= 'A' && c <= 'Z';
}

/**
*
* @param c
* @return true if character is small Latin letter or false for others
*/
private static boolean IsSmallLatinLetter(char c) {
return c >= 'a' && c <= 'z';
}

/**
*
* @deprecated TODO remove main and make JUnit Testing
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please enter the message (Latin Alphabet)");
String message = input.nextLine();
System.out.println(message);
System.out.println("Please enter the shift number");
int shift = input.nextInt() % 26;
System.out.println("(E)ncode or (D)ecode ?");
char choice = input.next().charAt(0);
switch (choice) {
case 'E':
case 'e':
System.out.println("ENCODED MESSAGE IS \n" + encode(message, shift)); //send our function to handle
break;
case 'D':
case 'd':
System.out.println("DECODED MESSAGE IS \n" + decode(message, shift));
}
}

}