本文针对的是asscii表中的字符。
**
代码
**
package Caesar;
/**
* @创建人
* @创建时间
* @描述 凯撒加密以及解密
* 默认仅要求得到英文字符时,密钥为0-26(0,26可以去除,没有意义),表里一共就这么多字符,超出去没有意义(环形)
* 要求为asscii可显示字符时,密钥为0-95
* 代码可以优化,加密解密都可以使用加密算法,无非密钥做个逆运算而已
*/
public class CaesarCipher {
/**
* 凯撒加密
* @param s 原文,明文
* @param key 凯撒加密的密钥,小于0为左移,大于0为右移
* @return 返回加密后的字符串
*/
private static String caesarEncrypt(String s,int key){
//无论是左移还是右移,统一换算成右移
if (key<0) key = 26+key;
System.out.println("key === "+key);
//将原文字符串拆分成字符数组,方便加密
char[] chars = s.toCharArray();
//引入一个字符串生成器,用于在移位加密之后,将字符数组重新返回字符串
StringBuilder stringBuilder = new StringBuilder();
//迭代字符数组,逐位加密
for (char achar : chars) {
//获取当前字符的asscii码
int a = achar;
/**
* 当实际应用中要求:明文为英文,译文也为英文时
*/
if (a>=65 && a<=90){ /** 大写字母*/
//采用模运算,英文字母只有26个,asscii表不止,防止字母溢出,
a = (a-65 + key) % 26;
//StringBuilder的append函数将移位之后的字符asscii码转换,再添加入字符串中
char newa = (char) (a+65);
stringBuilder.append( newa );
}else if (a>=97 && a<=122){ /** 小写字母*/
//采用模运算,英文字母只有26个,asscii表不止,防止字母溢出,
a = (a-97 + key) % 26;
//StringBuilder的append函数将移位之后的字符asscii码转换,再添加入字符串中
char newa = (char) (a+97);
stringBuilder.append( newa );
}
/**
* 当实际应用中要求:asscii表中可显示字符即可
* 可显示字符为32-126
*/
//无论是左移还是右移,统一换算成右移
// if (key<0) key = 95+key;
// System.out.println("key === "+key);
// a = (a - 32 + key) % 95;
// char newa = (char) (a + 32);
// stringBuilder.append(newa);
}
return stringBuilder.toString();
}
/**
* 凯撒解密
* @param s 密文
* @param key 密钥 小于0为左移,大于0为右移,此处密钥为加密秘钥,函数内已做逆运算
* @return 解密后的明文
*/
private static String caesarDecrypt(String s, int key){
//无论是左移还是右移,统一换算成右移
if (key>0) key = 26-key;
System.out.println("key === "+key);
//将密文字符串拆分成字符数组,方便逐个解密
char[] chars = s.toCharArray();
//引入一个字符串生成器,用于在解密之后,将字符数组重新返回字符串
StringBuilder stringBuilder = new StringBuilder();
//迭代字符数组,逐位解密
for (char achar : chars) {
//获取当前字符的asscii码
int a = achar;
/**
* 当实际应用中要求:明文为英文,译文也为英文时
*
*/
if (a>=65 && a<=90){ /** 大写字母*/
//采用模运算,英文字母只有26个,asscii表不止,防止字母溢出,
a = (a-65 + key ) % 26;
//StringBuilder的append函数将移位之后的字符asscii码转换,再添加入字符串中
char newa = (char) (a+65);
stringBuilder.append( newa );
}else if (a>=97 && a<=122){ /** 小写字母*/
//采用模运算,英文字母只有26个,asscii表不止,防止字母溢出,
a = (a-97 + key ) % 26;
//StringBuilder的append函数将移位之后的字符asscii码转换,再添加入字符串中
char newa = (char) (a+97);
stringBuilder.append( newa );
}
/**
* 当实际应用中要求:asscii表中可显示字符即可
* 可显示字符为32-126
*/
//无论是左移还是右移,统一换算成右移
// if (key>0) key = 95-key;
// System.out.println("key === "+key);
// a = (a - 32) % 95 + key;
// char newa = (char) (a + 32);
// stringBuilder.append(newa);
}
return stringBuilder.toString();
}
/**
* 测试main函数
*
*/
public static void main(String[] args) {
String s = caesarEncrypt("abczABCZ",3);
System.out.println("密码为:" + s);
System.out.println("解密文为:" + caesarDecrypt(s,3));
}
}
测试图
加密时为明文右移3位,解密时密文左移3位就等同于密文右移23位(针对于字母,要求为asscii表可显示字符时,周期95)。