[英]Java Caesar Cipher
在这个凯撒密码中,我获得了不正确的大写字母输出。 代码如下:
public class CaesarCipherCaseSensitive
{
public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
public static String encrypt(String pt, int shiftKey)
{
String ct = "";
for (int i = 0; i < pt.length(); i++)
{
int charPosition = ALPHABET.indexOf(pt.charAt(i));
int keyVal = (shiftKey + charPosition) % 26;
char replaceVal = ALPHABET.charAt(keyVal);
ct += replaceVal;
}
return ct;
}
public static String decrypt(String ct, int shiftKey)
{
String pt = "";
for (int i = 0; i < ct.length(); i++)
{
int charPosition = ALPHABET.indexOf(ct.charAt(i));
int keyVal = (charPosition - shiftKey) % 26;
if (keyVal < 0)
{
keyVal = ALPHABET.length() + keyVal;
}
char replaceVal = ALPHABET.charAt(keyVal);
pt += replaceVal;
}
return pt;
}
public static void main(String[] args)
{
String message1 = "ABCDEFGHIJKLMOPQRSTUVWXYZ";
System.out.println(encrypt(message1, 3));
System.out.println(decrypt(encrypt(message1, 3), 3));
System.out.println(encrypt(message1.toLowerCase(),5));
System.out.println(decrypt(encrypt(message1.toLowerCase(),5),5));
}
}
输出看起来像: ccccccccccccccccccccccccc zzzzzzzzzzzzzzzzzzzzzzz fghijklmnopqrtuvwxyzabcde abcdefghijklmopqrstuvwxyz
所需的输出是: DEFGHIJKLMOPQRSTUVWXYZABC ABCDEFGHIJKLMOPQRSTUVWXYZ fghijklmnopqrtuvwxyzabcde abcdefghijklmopqrstuvwxyz
问题是您将大写字母传递给方法indexOf()
,该方法检查ALPHABET
但未找到它,因此它返回-1。 您需要将大写字母转换为小写字母,或者添加大写字母。
我的解决方案,将大写字母转换为小写字母然后加密/解密是:
public class CaesarCipherCaseSensitive{
public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
public static String encrypt(String pt, int shiftKey){
String ct = "";
for (int i = 0; i < pt.length(); i++){
char letter = pt.charAt(i);
boolean upperCase = false;
if((int)letter < 91){
letter = (char)((int)letter + 32);
upperCase = true;
}
int charPosition = ALPHABET.indexOf(letter);
int keyVal = (shiftKey + charPosition) % 26;
char replaceVal = ALPHABET.charAt(keyVal);
if(upperCase){
replaceVal = (char)((int)replaceVal - 32);
}
ct += replaceVal;
}
return ct;
}
public static String decrypt(String ct, int shiftKey){
String pt = "";
for (int i = 0; i < ct.length(); i++){
char letter = ct.charAt(i);
boolean upperCase = false;
if((int)letter < 91){
letter = (char)((int)letter + 32);
upperCase = true;
}
int charPosition = ALPHABET.indexOf(letter);
int keyVal = (charPosition - shiftKey) % 26;
if (keyVal < 0){
keyVal = ALPHABET.length() + keyVal;
}
char replaceVal = ALPHABET.charAt(keyVal);
if(upperCase){
replaceVal = (char)((int)replaceVal - 32);
}
pt += replaceVal;
}
return pt;
}
public static void main(String[] args){
String message1 = "ABCDEFGHIJKLMOPQRSTUVWXYZ";
System.out.println(encrypt(message1, 3));
System.out.println(decrypt(encrypt(message1, 3), 3));
System.out.println(encrypt(message1.toLowerCase(),5));
System.out.println(decrypt(encrypt(message1.toLowerCase(),5),5));
}
}
这是一个解决方案,
private static final List<String> upperAlphabets = Arrays.asList(
"A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N",
"O", "P", "Q", "R", "S", "T", "U",
"V", "W", "X", "Y", "Z");
private static final List<String> upperAlphabetsRev = Arrays.asList(
"Z", "Y", "X", "W", "V", "U", "T",
"S", "R", "Q", "P", "O", "N", "M",
"L", "K", "J", "I", "H", "G", "F",
"E", "D", "C", "B", "A");
private static List<String> lowerAlphabets = new ArrayList<>();
private static List<String> lowerAlphabetsRev = new ArrayList<>();
private static void init() {
for (String c : upperAlphabets) {
lowerAlphabets.add(c.toLowerCase());
}
for (String c : upperAlphabetsRev) {
lowerAlphabetsRev.add(c.toLowerCase());
}
}
public static String encryptCaesar(String toEncrypt, int shiftTo) throws IllegalArgumentException {
if (shiftTo >= 26 || shiftTo < 0) {
throw new IllegalArgumentException("shiftTo should be lesser than 26 and greater than 0");
}
char[] encryptedString = new char[toEncrypt.length()];
int position = -1, pos, newPos;
boolean upper;
for (char c : toEncrypt.toCharArray()) {
position++;
pos = upperAlphabets.indexOf(String.valueOf(c));
if (pos == -1) {
upper = false;
pos = lowerAlphabets.indexOf(String.valueOf(c));
} else {
upper = true;
}
newPos = (pos + shiftTo) % 26;
encryptedString[position] = upper ? upperAlphabets.get(newPos).charAt(0) : lowerAlphabets.get(newPos).charAt(0);
}
return String.valueOf(encryptedString);
}
public static String decryptCaesar(String toDecrypt, int shiftTo) {
if (shiftTo >= 26 || shiftTo < 0) {
throw new IllegalArgumentException("shiftTo should be lesser than 26 and greater than 0");
}
char[] decryptedString = new char[toDecrypt.length()];
int position = -1, pos, newPos;
boolean upper;
for (char c : toDecrypt.toCharArray()) {
position++;
pos = upperAlphabetsRev.indexOf(String.valueOf(c));
if (pos == -1) {
upper = false;
pos = lowerAlphabetsRev.indexOf(String.valueOf(c));
} else {
upper = true;
}
newPos = (pos + shiftTo) % 26;
decryptedString[position] = upper ? upperAlphabetsRev.get(newPos).charAt(0) : lowerAlphabetsRev.get(newPos).charAt(0);
}
return String.valueOf(decryptedString);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.