1、实验目的
(1).了解传统密码技术
(2).掌握对称密码体制
(3).理解密钥原理
(4).了解网络保密通信
2、实验原理与理论基础
对称式加密就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术目前被广泛采用,如美国政府所采用的DES加密标准就是一种典型的“对称式”加密法,它的Session Key长度为56Bits。
对称密码体制中加密密钥与解密密钥相同,解密算法是加密算法的逆运算。对于任意加密,需要输入明文与密钥,反之解密需要输入密文和密钥。
3、实验内容
(1)、编程实现对称加密之凯撒密码(指定任意k,不能取除数字之外),用任意编程语言实现,在下面实验过程中体现源代码、运行截图(包括2个测试案例的运行界面);
(2)、编程实现对称加密之维吉尼亚密码,用任意编程语言实现,需在下面实验过程中体现源代码、运行截图(至少包括2个测试案例运行界面);
4、实验过程
(1)凯撒密码
源代码:
import java.util.Scanner;
public class Chi_SquareUtils{
public static void main(String[] args) {
System.out.println("请输入明文:");
Scanner zx=new Scanner(System.in);//创建Scanner对象
String z=zx.nextLine();
System.out.println("请输入密钥:");
Scanner zx1=new Scanner(System.in);
int key=zx1.nextInt();//将下一输入项转换成int类型
Encryption(z,key);//调用Encryption方法
}
public static void Encryption(String str, int k) {
String string="";
for(int i=0;i<str.length();i++) {
char c=str.charAt(i);
if(c>='a'&&c<='z')//如果字符串中的某个字符是小写字母
{
c+=k%26;//移动key%26位
if(c<'a')
c+=26;//向左超界
if(c>'z')
c-=26;//向右超界
}
if(c>='A'&&c<='Z')//如果字符串中的某个字符是大写字母
{
c+=k%26;//移动key%26位
if(c<'a')
c+=26;//向左超界
if(c>'z')
c-=26;//向右超界
}
string +=c;//将解密后的字符连成字符串
}
System.out.println("加密后为:"+string);
}
}
运行截图:
(2)维吉尼亚密码
源代码:
import java.util.Scanner;
public class MultipleTableMima {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入密匙:");
String s = scanner.next();
MultipleTableMima mima = new MultipleTableMima();
System.out.print("请输入明文:");
String mingWen = scanner.next();
String sl = mima.encryption(mingWen, s);
System.out.println("加密后的密文是:"+sl);
}
/**
* 加密
* @param plaintext 明文
* @param secretKey 密钥
* @return 密文
*/
public String encryption(String plaintext,String secretKey){
String ciphertext = "";
char[][] chars = new char[2][plaintext.length()];
for (int i = 0; i <plaintext.length() ; i++) {
chars[0][i]=plaintext.charAt(i);
chars[1][i]=secretKey.toUpperCase().charAt(i%(secretKey.length()));
}
char[] charArray = plaintext.toCharArray();
for (int i = 0; i <charArray.length ; i++) {
int j = charArray[i];
if (j>=97&&j<=97+26){
int k = chars[1][i];
char te = (char) (((j - 97) + (k - 65)) % 26+65);
ciphertext = ciphertext+te;
}
if (j>=65&&j<=65+26){
int k = chars[1][i];
char te = (char) (((j - 65) + (k - 65)) % 26+97);
ciphertext = ciphertext+te;
}
}
return ciphertext;
}
}
运行截图: