一、实验名称: Caesar密码实验
二、实验要求:
1、了解古典密码的几种分类。
2、掌握Caesar密码的加减密原理。
3、运用IntelliJ IDEA实现Caesar密码程序。
三、实验内容:
1、密码学是一门古老的学科,起源于在古代军事作战中如何隐密地传递信息的问题。从古希腊时期一直到1949年,都属于古典密码的发展时期。古典密码主要分为两种:替换密码和置换密码。替换密码指的是根据替换表将明文逐字母换成其他的字母来产生密文;置换密码指的是将明文中的字母重新排列来产生密文。
2、在古罗马时期,执政官凯撒(Caesar)在军事作战中使用了一种密码用于与其将军们通信,后人称其为“Caesar密码”。它的描述相当简单,设
明文 M=m(1)m(2)…m(n),m(i) 均为英文字母,
密钥 k(也就是偏移量)是0~26的整数,
密文 C=c(1)c(2)…c(n),c(i)均为英文字母。
1)加密
先将明文中每个对应到0~25的整数,得到;
再根据密钥k将作偏移,得到
记为
d’i仍然是0~25的整数;
最后对应回英文字母,得到密文。
2)解密
类似于加密,只需要把密钥换成是26-k,就能将密文解密成明文。
3)示例
明文为attacknow,密钥为18,加密时将每个字母用相隔18个位置后的字母替换,得到密文为sllsucfgo;再取密钥为26-18=8,用于解密密文sllsucfgo,得到明文attacknow。
3、使用IntelliJ IDEA编写Java程序,实现Caesar密码程序。
主要步骤:
1)输入要求“加密、解密”
2)输入密钥
3)输出“明文、密文”
提示点:
1 ) 可能会用到String, char[], int之间的相互转化
2 ) ‘a’~ ‘z’ 的ASCII码值分别是97~122
测试示例:明文attacknow,加密密钥为18,密文sllsucfgo,解密密钥为8。
“加密/解密”事件程序代码如下:
package Caesar;
import java.util.Scanner;
import static java.lang.System.exit;
public class Caesa {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请选择解密或加密");
System.out.println("1.加密");
System.out.println("2.解密");
int n = sc.nextByte();
if (n == 1 || n == 2) {
if (n == 1) {
System.out.println("请输入k");
int k;
k = sc.nextInt();
System.out.println("请输入需要加密的小写字母字符串");
String str1 = sc.next();
char[] ch1 = str1.toCharArray();
char[] ch2 = new char[ch1.length];
for (int i = 0; i < ch1.length; i++) {
ch2[i] = (char) (((int) ch1[i] - 97 + k) % 26 + 97);
}
System.out.println("密文为:");
for (char j : ch2) {
System.out.print(j);
}
} else {
System.out.println("请输入k");
int k;
k = sc.nextInt();
System.out.println("请输入需要解密的小写字母字符串");
String str2 = sc.next();
char[] ch3 = str2.toCharArray();
char[] ch4 = new char[ch3.length];
for (int i = 0; i < ch3.length; i++) {
ch4[i] = (char) (((int) ch3[i] - 97 - k + 26) % 26 + 97);
}
for (char j : ch4) {
System.out.print(j);
}
}
} else {
exit(1);
}
}
}
测试结果截屏如下: