【算法】Java凯撒密码实现方法
1、凯撒密码介绍
凯撒密码作为一种最简单的消息加密方式,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,由此可见,位数就是凯撒密码加密和解密的秘钥。
2、凯撒密码的实现
在此之前我们必须得了解一个基本概念==“移位和循环移位”==
移位和循环移位
移位就是将一段数码按照规定的位数整体性地左移或右移。循环右移就是当右移时,把数码的最后的位移到数码的最前头,循环左移相反。
例如,对十进制数码0123456789右移一位(十进制位)的结果为9012345678,而循环左移一位得到的结果则为1234567890。
凯撒密码就是使用的循环移位
2.1、基于ASCII码实现凯撒密码
加密方法如下:
@Test
public void test(){
String abc = asciiCaesarEncrypt("ABC", 125);
System.out.println(abc);
}
public String asciiCaesarEncrypt(String str,int offset){
char[] chars = str.toCharArray();
//循环位移算法
for (int i = 0; i < chars.length; i++) {
int i1 = chars[i] + offset;
if(i1>127){
chars[i]= (char) (i1%=128);
}else if (i1<0){
int abs = Math.abs(i1)%128;
chars[i]=(char)(128-abs);
}else {
chars[i] += offset;
}
}
return String.valueOf(chars);
}
上面的运行结果
>?@
解密方法如下:
public String asciiCaesarDecrypt(String str,int offset){
char[] chars = str.toCharArray();
//循环位移算法
for (int i = 0; i < chars.length; i++) {
int i1 = chars[i] - offset;
if(i1>127){
chars[i]= (char) (i1%=128);
}else if (i1<0){
int abs = Math.abs(i1)%128;
chars[i]=(char)(128-abs);
}else{
chars[i] -= offset;
}
}
return String.valueOf(chars);
}
2.2、基于字母表实现的凯撒密码
加密方法如下:
@Test
public void test(){
String abc = lowerCaseCaesarEncrypt("zabc", 25);
System.out.println(abc);
}
public String lowerCaseCaesarEncrypt(String str,int offset){
char[] chars=str.toCharArray();
char[] lowerCase=new char[26];
for (int i = 0; i < 26; i++) {
lowerCase[i]= (char) ('a'+i);//如果需要大写字母表这里可以填'A'
}
String lowerCaseStr=String.valueOf(lowerCase);
for (int i = 0; i < chars.length; i++) {
int i1 = lowerCaseStr.indexOf(chars[i]) + offset;
if(i1>25){
chars[i]=lowerCase[(i1%=26)];
}else if (i1<0){
int abs = Math.abs(i1)%26;
chars[i]=lowerCase[(26-abs)];
}else{
chars[i] += offset;
}
}
return String.valueOf(chars);
}
上面的运行结果
yzab
解密方法如下:
public String lowerCaseCaesarDecrypt(String str,int offset){
char[] chars=str.toCharArray();
char[] lowerCase=new char[26];
for (int i = 0; i < 26; i++) {
lowerCase[i]= (char) ('a'+i);//如果需要大写字母表这里可以填'A'
}
String lowerCaseStr=String.valueOf(lowerCase);
for (int i = 0; i < chars.length; i++) {
int i1 = lowerCaseStr.indexOf(chars[i]) - offset;
if(i1>25){
chars[i]=lowerCase[(i1%=26)];
}else if (i1<0){
int abs = Math.abs(i1)%26;
chars[i]=lowerCase[(26-abs)%26];
}else{
chars[i] -= offset;
}
}
return String.valueOf(chars);
}
本文到此完毕