900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 信息安全——Java实现凯撒加密算法和解密算法----详细的代码注释

信息安全——Java实现凯撒加密算法和解密算法----详细的代码注释

时间:2022-03-13 22:00:50

相关推荐

信息安全——Java实现凯撒加密算法和解密算法----详细的代码注释

①凯撒密码算法简介

凯撒密码是一种替换加密技术,明文也就是原文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。假设偏移量是2的话,所有字母A都被替换成C,B变成D,以此类推。同样的我们也可以将它推广到数字,我们将其中的偏移量称之为密钥,通常密钥由我们自己设定。如图1.1所示是以密钥为2的替换原理

图1.1

②凯撒算法代码实现

(1)加密算法实现

// 凯撒加密方法public static String Encryption(String str, int k) {String cipher = "";for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);// 小写字母的转换if (c >= 'a' && c <= 'z') {c += k % 26;// 向左超界if (c < 'a') c += 26;// 向右超界if (c > 'z') c -= 26;} else if (c >= 'A' && c <= 'Z') {// 大写字母的转换c += k % 26;// 向左超界if (c < 'A') c += 26;// 向右超界if (c > 'Z') c -= 26;} else if (c >= '0' && c <= '9') {// 数字的转换c += k % 10;// 向左超界if (c < '0') c += 10;// 向右超界if (c > '9') c -= 10;}// 将加密后的字符连成字符串cipher += c;}return cipher;}

(2)解密算法实现

// 凯撒解密方法public static String Decryption(String str, int k) {String cipher = "";/*密钥转换如果密文是向前移位,解密时就向后移位如果密文是向后移位,解密时就向前移位*/k = 0 - k;for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);// 小写字母的转换if (c >= 'a' && c <= 'z') {c += k % 26;// 向左超界if (c < 'a') c += 26;//向右超界if (c > 'z') c -= 26;} else if (c >= 'A' && c <= 'Z') {// 大写字母的转换c += k % 26;// 向左超界if (c < 'A') c += 26;// 向右超界if (c > 'Z') c -= 26;} else if (c >= '0' && c <= '9') {// 数字的转换c += k % 10;// 向左超界if (c < '0') c += 10;// 向右超界if (c > '9') c -= 10;}//将解密后的字符连成字符串cipher += c;}return cipher;}

③具体应用

(1)问题描述:读一个文件a1.txt中的字符,利用凯撒密码算法加密,并将密文写入b1.txt,将解密出来的明文写入c1.txt。

(2)代码实现:

import java.io.*;import java.util.Scanner;public class CaesarDemo2 {public static void main(String[] args) throws IOException {// File类的实例化File file1 = new File("E:\\postgraduate\\First year\\dataSecurity\\Caesar\\a1.txt");// 用于存放读取到的文件的内容String reader = ReadFile(file1);// 输出明文文件System.out.println("文件a1中的原文为:\n" + reader);// 输入密钥System.out.println("请输入密钥:");Scanner s = new Scanner(System.in);// 获取输入的密钥int key = s.nextInt();// 调用加密方法String encry = Encryption(reader, key);// 输出加密后的内容System.out.println("文件加密后的内容为:\n" + encry);// 文件名和文件保存的路径File file2 = new File("E:\\postgraduate\\First year\\dataSecurity\\Caesar\\b1.txt");// 把密文写入到文件中去writeFile(file2, encry);// 写入完成System.out.println("文件已进行加密并保存在b1中!");// 调用解密方法String decry = Decryption(reader, key);// 输出解密后的内容System.out.println("文件解密后的内容为:\n" + decry);// 文件名和文件路径File file3 = new File("E:\\postgraduate\\First year\\dataSecurity\\Caesar\\c1.txt");// 把解密后的明文写入到文件中writeFile(file3, decry);// 写入完成System.out.println("文件已进行加密并保存在c1中!");}// 读取文件方法public static String ReadFile(File file) throws IOException {// FileReader流的实例化FileReader fr = new FileReader(file);// 将字符流放入字符流缓冲区中BufferedReader bf = new BufferedReader(fr);// 声明一个字符串数组,用于接收读取的文档内容StringBuffer sb = new StringBuffer();// 定义一个字符串变量用于接收读取的文件内容String Line;// 按行读取while ((Line = bf.readLine()) != null) {//将读取到的字符串放入到字符串数组中sb.append(Line);sb.append("\n");}// 将字符串数组转为字符串String s = new String(sb);// 关闭流bf.close();fr.close();return s;}// 写文件方法public static void writeFile(File file, String content) throws IOException {//filewriter流的实例化FileWriter fw = new FileWriter(file);//将字符流放入到字符流缓冲区中BufferedWriter bw = new BufferedWriter(fw);//进行写出操作bw.write(content);//关闭流bw.close();}// 凯撒加密方法public static String Encryption(String str, int k) {String cipher = "";for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);// 小写字母的转换if (c >= 'a' && c <= 'z') {c += k % 26;// 向左超界if (c < 'a') c += 26;// 向右超界if (c > 'z') c -= 26;} else if (c >= 'A' && c <= 'Z') {// 大写字母的转换c += k % 26;// 向左超界if (c < 'A') c += 26;// 向右超界if (c > 'Z') c -= 26;} else if (c >= '0' && c <= '9') {// 数字的转换c += k % 10;// 向左超界if (c < '0') c += 10;// 向右超界if (c > '9') c -= 10;}// 将加密后的字符连成字符串cipher += c;}return cipher;}// 凯撒解密方法public static String Decryption(String str, int k) {String cipher = "";/*密钥转换如果密文是向前移位,解密时就向后移位如果密文是向后移位,解密时就向前移位*/k = 0 - k;for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);// 小写字母的转换if (c >= 'a' && c <= 'z') {c += k % 26;// 向左超界if (c < 'a') c += 26;//向右超界if (c > 'z') c -= 26;} else if (c >= 'A' && c <= 'Z') {// 大写字母的转换c += k % 26;// 向左超界if (c < 'A') c += 26;// 向右超界if (c > 'Z') c -= 26;} else if (c >= '0' && c <= '9') {// 数字的转换c += k % 10;// 向左超界if (c < '0') c += 10;// 向右超界if (c > '9') c -= 10;}//将解密后的字符连成字符串cipher += c;}return cipher;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。