①凯撒密码算法简介
凯撒密码是一种替换加密技术,明文也就是原文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。假设偏移量是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;
}
}
本文转载自: https://blog.csdn.net/weixin_45454242/article/details/126933582
版权归原作者 LAN¥¥ 所有, 如有侵权,请联系我们删除。
版权归原作者 LAN¥¥ 所有, 如有侵权,请联系我们删除。