我用它运行的java做了凯撒密码,但在用户输入密钥后没有加密任何东西!
这是我的代码
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
答案 0 :(得分:1)
试试这个:
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();
}
}
这适用于所有字母字符串......但是根据您的程序,这会将原始邮件转换为小写。因此,这不是纯加密,因为您的程序不区分大小写。
如果您希望程序区分大小写,请执行以下程序:
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();
}
}
希望这能给出一些想法。一切顺利。
答案 1 :(得分:1)
使用indexOf
效率不高......您可以对char
值进行整数运算以获取其索引。
我在代码中包含了注释以解释更多内容,但这就是我提出的内容。
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));
}
}
输出应该是
Please enter a password: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Please enter a key between 1-25: 1
Password: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Encrypted: BCDEFGHIJKLMNOPQRSTUVWXYZA
Decrypted: ABCDEFGHIJKLMNOPQRSTUVWXYZ
答案 2 :(得分:1)
这可能是最简单的方法,也是最容易理解的方法:
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);
}
}
}
答案 3 :(得分:0)
private static final int ALPHABET_SIZE = 26;
public static String encryptOrDecrypt(String str, int rotateBy, boolean isEncryption) {
rotateBy = rotateBy % 26;
StringBuilder result = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char temp = str.charAt(i);
temp = rotate(temp, rotateBy,isEncryption);
result.append(temp);
}
return result.toString();
}
private static char rotate(char c, int rotateBy,boolean isEncryption) {
int start=0;
int end =0;
if (isLowerCase(c)) {
start='a';
end = 'z';
} else if (isUpperCase(c)) {
start='A';
end = 'Z';
}else {
return c;
}
if (isEncryption){
c += rotateBy;
}else {
c -= rotateBy;
}
if (c < start) {
return (char) (c + ALPHABET_SIZE);
}
if (c > end) {
return (char) (c - ALPHABET_SIZE);
}
return c;
}
public static void main(String args[]) {
String planeText= "TrilokiNathYadav";
System.out.println("Plane Text : "+planeText);
String encrypted =encryptOrDecrypt(planeText,2,true);
System.out.println("Encrypted : "+encrypted);
String decrypted = encryptOrDecrypt(encrypted,2,false);
System.out.println("Decrypted : "+decrypted);
}