java凯撒密码 [英] java caesar cipher code
本文介绍了java凯撒密码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我用它运行的java做了凯撒密码,但在用户输入密钥后不加密任何东西!
i did caesar cipher code by java it runs but doesnt encrypt anything after user enter the key !
这是我的代码
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();
}
}
运行:
Enter The Plain Text:
Reem LA
Enter The Key:
2
The Cipher Text
推荐答案
使用 indexOf
不是很有效...你可以对 char
值做整数运算得到他们的指数.
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.
", key);
}
} while (key < 1 || key > 25);
System.out.println("Password: " + password);
String encryption = cipher(password, key);
System.out.println("Encrypted: " + encryption);
System.out.println("Decrypted: " + cipher(encryption, -key));
}
}
输出应该类似于
Please enter a password: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Please enter a key between 1-25: 1
Password: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Encrypted: BCDEFGHIJKLMNOPQRSTUVWXYZA
Decrypted: ABCDEFGHIJKLMNOPQRSTUVWXYZ
这篇关于java凯撒密码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文