i did caesar cipher code by java it runs but doesnt encrypt anything after user enter the key !
here is my code
public class CaesarCipher
{
public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
public static String encrypt(String plainText, int shiftKey)
{
plainText = plainText.toLowerCase();
String cipherText = "";
for (int i = 0; i < plainText.length(); i++)
{
int charPosition = ALPHABET.indexOf(plainText.charAt(i));
int keyVal = (shiftKey + charPosition) % 26;
char replaceVal = ALPHABET.charAt(keyVal);
cipherText += replaceVal;
}
return cipherText;
}
public static String decrypt(String cipherText, int shiftKey)
{
cipherText = cipherText.toLowerCase();
String plainText = "";
for (int i = 0; i < cipherText.length(); i++)
{
int charPosition = ALPHABET.indexOf(cipherText.charAt(i));
int keyVal = (charPosition - shiftKey) % 26;
if (keyVal < 0)
{
keyVal = ALPHABET.length() + keyVal;
}
char replaceVal = ALPHABET.charAt(keyVal);
plainText += replaceVal;
}
return plainText;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("Enter the String for Encryption: ");
String message = new String();
message = sc.next();
System.out.println(encrypt(message, 3));
System.out.println(decrypt(encrypt(message, 3), 3));
sc.close();
}
}
run:
Enter The Plain Text:
Reem LA
Enter The Key:
2
The Cipher Text
Using indexOf
is not very efficient... You can do integer arithmetic on char
values to get their indices.
I included comments in the code to explain more, but this is what I came up with.
public class CaesarCipher {
// Rotate a character k-positions
public static char cipher(char c, int k) {
// declare some helping constants
final int alphaLength = 26;
final char asciiShift = Character.isUpperCase(c) ? 'A' : 'a';
final int cipherShift = k % alphaLength;
// shift down to 0..25 for a..z
char shifted = (char) (c - asciiShift);
// rotate the letter and handle "wrap-around" for negatives and value >= 26
shifted = (char) ((shifted + cipherShift + alphaLength) % alphaLength);
// shift back up to english characters
return (char) (shifted + asciiShift);
}
// Rotate a string k-positions
public static String cipher(String s, int k) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
sb.append(cipher(s.charAt(i), k));
}
return sb.toString();
}
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
String password;
int key;
System.out.print("Please enter a password: ");
password = keyboard.nextLine();
do {
System.out.print("Please enter a key between 1-25: ");
key = keyboard.nextInt();
if (key < 1 || key > 25) {
System.out.printf(" The key must be between 1 and 25, you entered %d.\n", key);
}
} while (key < 1 || key > 25);
System.out.println("Password:\t" + password);
String encryption = cipher(password, key);
System.out.println("Encrypted:\t" + encryption);
System.out.println("Decrypted:\t" + cipher(encryption, -key));
}
}
The output should be something like
Please enter a password: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Please enter a key between 1-25: 1
Password: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Encrypted: BCDEFGHIJKLMNOPQRSTUVWXYZA
Decrypted: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Try this:
import java.util.*;
public class CaesarCipher
{
public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
public static String encrypt(String plainText, int shiftKey)
{
plainText = plainText.toLowerCase();
String cipherText = "";
for (int i = 0; i < plainText.length(); i++)
{
char replaceVal = plainText.charAt(i);
int charPosition = ALPHABET.indexOf(replaceVal);
if(charPosition != -1) {
int keyVal = (shiftKey + charPosition) % 26;
replaceVal = ALPHABET.charAt(keyVal);
}
cipherText += replaceVal;
}
return cipherText;
}
public static String decrypt(String cipherText, int shiftKey)
{
cipherText = cipherText.toLowerCase();
String plainText = "";
for (int i = 0; i < cipherText.length(); i++)
{
char replaceVal = cipherText.charAt(i);
int charPosition = ALPHABET.indexOf(replaceVal);
if(charPosition != -1) {
int keyVal = (charPosition - shiftKey) % 26;
if (keyVal < 0) {
keyVal = ALPHABET.length() + keyVal;
}
replaceVal = ALPHABET.charAt(keyVal);
}
plainText += replaceVal;
}
return plainText;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("Enter the String for Encryption: ");
String message = new String();
message = sc.nextLine();
System.out.println(encrypt(message, 3));
System.out.println(decrypt(encrypt(message, 3), 3));
sc.close();
}
}
This will work for all alphabetical strings... But as per your program, this will convert the original message to lowercase. So this is not pure encryption since your program is case insensitive.
If you want your program to be case sensitive, here is the program:
import java.util.*;
public class CaesarCipher
{
public static final String ALPHABET_LOWER = "abcdefghijklmnopqrstuvwxyz";
public static final String ALPHABET_UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String encrypt(String plainText, int shiftKey)
{
String cipherText = "";
for (int i = 0; i < plainText.length(); i++)
{
int charPosition = -1;
char replaceVal;
int keyVal = -1;
char val = plainText.charAt(i);
System.out.println(val);
if(Character.isUpperCase(val)) {
charPosition = ALPHABET_UPPER.indexOf(val);
if(charPosition != -1) {
keyVal = (shiftKey + charPosition) % 26;
replaceVal = ALPHABET_UPPER.charAt(keyVal);
} else {
replaceVal = plainText.charAt(i);
}
} else {
charPosition = ALPHABET_LOWER.indexOf(val);
if(charPosition != -1) {
keyVal = (shiftKey + charPosition) % 26;
replaceVal = ALPHABET_LOWER.charAt(keyVal);
} else {
replaceVal = plainText.charAt(i);
}
}
System.out.println("Cipher: "+cipherText);
cipherText += replaceVal;
}
return cipherText;
}
public static String decrypt(String cipherText, int shiftKey)
{
String plainText = "";
for (int i = 0; i < cipherText.length(); i++)
{
int charPosition = -1;
char replaceVal;
int keyVal = -1;
char val = cipherText.charAt(i);
if(Character.isUpperCase(val)) {
charPosition = ALPHABET_UPPER.indexOf(val);
if(charPosition != -1) {
keyVal = (charPosition - shiftKey) % 26;
if (keyVal < 0) {
keyVal = ALPHABET_UPPER.length() + keyVal;
}
replaceVal = ALPHABET_UPPER.charAt(keyVal);
} else {
replaceVal = cipherText.charAt(i);
}
} else {
charPosition = ALPHABET_LOWER.indexOf(val);
if(charPosition != -1) {
keyVal = (charPosition - shiftKey) % 26;
if (keyVal < 0) {
keyVal = ALPHABET_LOWER.length() + keyVal;
}
replaceVal = ALPHABET_LOWER.charAt(keyVal);
} else {
replaceVal = cipherText.charAt(i);
}
}
plainText += replaceVal;
}
return plainText;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("Enter the String for Encryption: ");
String message = new String();
message = sc.nextLine();
System.out.println(encrypt(message, 3));
System.out.println(decrypt(encrypt(message, 3), 3));
sc.close();
}
}
Hope this gives some idea. All the best.
This is probably the easiest way to do it and the most easy to understand:
import java.util.*;
public class CeaserCipher {
public static void main (String [] args) {
Scanner input = new Scanner(System.in);
System.out.print("Type your message ");
String message = input.nextLine().toUpperCase();
System.out.print("Set Encoding Key ");
int key = input.nextInt() % 26;
for (int i = 0; i < message.length(); i++) {
char c = message.charAt(i);
if (c <= 64 || c >= 91) {
c += 0;
}
else {
c += key;
if (c >= 91) {
c -= 26;
}
}
System.out.print(c);
}
}
}