【题目描述】替代密码的原理是使用替代法进行加密,就是将明文由其它的字母、数字或符合所代替后形成密文。这里每个明文字母对应的密文字母可能是一个,也可能是多个。接收者对密文进行逆向替换即可得到明文。
本次实验中采用单表密码算法的一种典型算法——凯撒密码,又称循环移位密码。
其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥; 为密文字母在字母表中对应的位置数。
【代码部分】
package Practice1;
import java.util.Scanner;
public class CaesarDemo {
private String initStr;
public String targetStr;
private String alphabet =
"abcdefghijklmnopqrstuvwxyz";
private int k = 0;
public CaesarDemo(String...string){
if(string.length==2){
this.alphabet
= string[0];
}
this.initStr = string[1];
this.k =
Integer.parseInt(string[2]);
}
private int isContain(char ch){
for (int i = 0;i
< alphabet.length();i++){
if
(ch!=alphabet.toCharArray()[i])
continue;
else
return
i;
}
return -1;
}
public String Encrypt(){
char[] alphabetChar =
this.alphabet.toCharArray();
char[] initChar =
initStr.toCharArray();
for (int i =
0;i<initStr.length();i++){
if
(isContain(initChar[i])==-1){
return
targetStr = "你输入的字符不在字母表中,请检查输入!";
}
initChar[i] =
alphabetChar[(isContain(initChar[i]) +
k)%alphabetChar.length];
}
targetStr = new
String(initChar);
return targetStr;
}
public String reverseEncrypt(){
char[] alphabetChar =
this.alphabet.toCharArray();
char[] initChar =
initStr.toCharArray();
for (int i =
0;i<initStr.length();i++){
if
(isContain(initChar[i])==-1){
return
targetStr = "你输入的字符不在字母表中,请检查输入!";
}
initChar[i] =
alphabetChar[(isContain(initChar[i]) -
k)%alphabetChar.length];
}
targetStr = new
String(initChar);
return targetStr;
}
public static void main(String[] args) {
// TODO Auto-generated method
stub
String initStr = null;
String alphabet = null;
CaesarDemo caesar = null;
int k = 0;
Scanner scan = new
Scanner(System.in);
//加密过程
System.out.println("加密过程:");
System.out.println("请输入自定义字母表(默认为正常小写英语字母序列,采用默认形式请输入“-0”):");
alphabet = scan.next();
System.out.println("请输入想要加密的字符串:");
initStr = scan.next();
System.out.println("请输入想要加密的密钥_k:");
k = scan.nextInt();
if(alphabet!="-0")
caesar = new
CaesarDemo(alphabet,initStr,k+"");
else
caesar = new
CaesarDemo(initStr,k+"");
System.out.println("完成加密得到密文为:"+caesar.Encrypt());
//解密过程
System.out.println("解密过程:");
System.out.println("请输入自定义字母表(默认为正常小写英语字母序列,采用默认形式请输入“-0”):");
alphabet = scan.next();
System.out.println("请输入想要解密的字符串:");
initStr = scan.next();
System.out.println("请输入想要解密的密钥_k:");
k = scan.nextInt();
if(alphabet!="-0")
caesar = new
CaesarDemo(alphabet,initStr,k+"");
else
caesar = new
CaesarDemo(initStr,k+"");
System.out.println("完成加密得到密文为:"+caesar.reverseEncrypt());
}
}
【测试用例】输入字母表:abcdefg 输入欲加密字符串:cd
输入密钥:2
得到测试结果为:ef