当前位置:文档之家› 信息安全实验报告一

信息安全实验报告一

实验成绩《信息安全概论》实验报告实验一古典密码实验专业班级:学号:姓名:完成时间:2016/ 05/ 09一、实验目的理解简单加密算法的原理;掌握凯撒密码的原理,完成凯撒密码加解密程序的编写;通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。

二、实验内容根据凯撒密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现凯撒加密和解密功能。

三、实验环境和开发工具1.Windows 7 系统2.Eclipse3.JDK 1.7四、实验步骤和结果首先获取要加密的内容以及密钥,凯撒密码的密钥即字符移动的位数。

由于凯撒密码器的移位是针对字符的,因此需要将待加密的内容中每个字符取出,然后针对每个字符分别加以移位。

主要步骤如下:(1)读取要加密的字符串、密钥。

(2)取出字符串中每个字符。

使用字符串类的 charAt()方法取出每个字符,分别加以移位。

(3)对每个字符进行移位。

由于字母表中共26个字符,因此移位前先将移动的位数(key)和26取模。

由于Java中字符和整型可自动转换,因此将字符加上一个正整数即代表在字母表中右移多少位。

如果移动的位数是负值,则代表在字母表中左移多少位。

尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或左移仍可能发生超界。

如字母x右移4位应该是字母b,但将字母x增加4后超出26个字母的范围。

因此移位后使用两个if语句判断一下,如果向左超界(c<'a')则增加26;向右超界(c>'z')则减去26。

源程序:package Caesar;import java.io.*;import java.util.Scanner;/*** @author SiRuYan*/public class Caesar {// 声明一些全局变量public static String path;public static String estr = "";public static char c;/*** 凯撒密码加密方法** @param str* @param n*/public static void Encode(String str, int n) {for (int i = 0; i < str.length(); i++) {c = str.charAt(i);if (c >= 'a' && c <= 'z')if (c + n % 26 <= 'z') // 移位后的字母不大于小写字母z,直接移位estr += (char) (c + n % 26);else// 移位后的字母大于小写字母z,需要在26个字母之间循环estr += (char) ('a' + ((n - ('z' - c) - 1) % 26));else if (c >= 'A' && c <= 'Z')if (c + n % 26 <= 'Z') // 移位后的字母不大于大写字母Z,直接移位estr += (char) (c + n % 26);else// 移位后的字母大于大写字母z,需要在26个字母之间循环estr += (char) ('A' + ((n - ('Z' - c) - 1) % 26));else if (c >= '0' && c <= '9') // 对数字进行加密if (c + n % 10 <= '9')estr += (char) (c + n % 10);elseestr += (char) ('0' + ((n - ('9' - c) - 1) % 10));elseestr += c;}}/*** 凯撒密码解密方法* @param str* @param n*/public static void Decode(String str, int n) {for (int i = 0; i < str.length(); i++) {c = str.charAt(i);if (c >= 'a' && c <= 'z')if (c - n % 26 >= 'a')estr += (char) (c - n % 26);elseestr += (char) ('z' - (n - (c - 'a') - 1) % 26);else if (c >= 'A' && c <= 'Z')if (c - n % 26 >= 'A')estr += (char) (c - n % 26);elseestr += (char) ('Z' - (n - (c - 'A') - 1) % 26);else if (c >= '0' && c <= '9')if (c - n % 10 >= '0')estr += (char) (c - n % 10);elseestr += (char) ('9' - (n - (c - '0') - 1) % 10);elseestr += c;}}public static void main(String args[]) {String array = "";Scanner in = null;int num;.System.out.println("----------------凯撒密码----------------");System.out.println("------只支持英文和阿拉伯数字-By SiRuYan------");try {System.out.println("1、加密\n2、解密\n3、暴力破解");System.out.print("请选择:");in = new Scanner(System.in); // 读入选择序号String ed = in.next();if (ed.equals("1") || ed.equals("2") || ed.equals("3")) {System.out.print("文件路径(*.txt):");path = in.next(); // 读入加密文件路径File file = new File(path); // 声明文件变量,以便读入指定文件路径下的文件内容FileInputStream rdf = new FileInputStream(file);// available()(FileInputStream变量)方法返回的实际可读字节数,也就是总大小byte[] s = new byte[rdf.available()];// System.out.println("文件的大小:"+rdf.available()); 测试语句int b = rdf.available();while ((b = rdf.read(s, 0, b)) != -1) { // 将文件内容读入字节数组中String content = new String(s, 0, b);array = array + content;}rdf.close(); // 关闭输入流if (ed.equals("3")) { // 3 暴力破解for (int k = 1; k <= 25; k++) {Decode(array, k);System.out.println("密钥为 " + k + " 时,结果是" + estr);estr = "";if (k >= 10) {for (int j = 1; j <= 9; j++) {Decode(array, k + 26 * j);System.out.println("密钥为 " + (k + 26 * j)+ " 时,结果为" + estr);estr = "";}}}System.out.print("正确的密钥为(整数):");int result = in.nextInt();Decode(array, result);} else {System.out.print("密钥(整数):");num = in.nextInt();if (ed.equals("1")) // 1 加密Encode(array, num);else// 2 解密Decode(array, num);}// 最后重新把加密、解密后的内容,借助文件、缓冲区输入流重新写入文件File f = new File(path);FileWriter outFile = new FileWriter(f);BufferedWriter bufferOut = new BufferedWriter(outFile);bufferOut.write(estr);bufferOut.newLine();bufferOut.flush();bufferOut.close();System.out.print("原文件是否已成功加密或解密!");} elseSystem.out.print("您输入有误。

");} catch (Exception e) {System.out.print("输入错误。

");}}}运行结果(注意实验对文件完成加、解密):密钥为: 3 。

加密前、后结果如下图:五、实验遇到问题及解决方法问题1:程序起初是在eclipse中运行,现在回归到控制台。

相关主题