java加密解密练习
1. 实验要求
- 设有一段英文文章,为简单起见,仅由26个小写字母、空格、标点符号(引号和逗号)组成,符号集合共29个。现在自定义一种一一映射规则,将这29个符号映射(替代)为同集合中的符号,比如b用k替代、u用v替代、t用s替代、空格用空格替代等等。这样but就被替换为kvs,从而实现了简单加密。试编写一java程序,实现上述替代规则(规则自己定义),从一个txt文件中 读取明文,将加密后的密文重新写到一个新文件中。
- 对任务1中加密的密文进行解密,看看解密后的文件是否与明文相同。
2. 实验代码及结果
对于这个问题我认为首先考察的就是java对于文本的操作,包括读取以及写入。其次才是对于加密解密功能的实现。
2.1 加密
package main.java.demo;
/**
* Created with IntelliJ IDEA.
* User: kingback
* Author:king@王延凯
* Date: 2019/7/25
* Time: 18:08
* Description: No Description
*/
import java.io.*;//导入java.io包中的所有类
import java.util.*;//导入java.util包中的所有类
public class encryption {
public static void main(String[] args) {
String wen = "abcd.def zyz";
String pass = "123456789";
// 使用ArrayList来存储每行读取到的字符串
ArrayList<String> arrayList = new ArrayList<>();
try {
FileReader fr = new FileReader("C:\\Users\\kingback\\Desktop\\龙华老师资料\\上交资料\\第十次上交材料\\英文.txt");
BufferedReader bf = new BufferedReader(fr);
String str;
// 按行读取字符串
while ((str = bf.readLine()) != null) {
arrayList.add(str);
}
bf.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对ArrayList中存储的字符串进行处理
int length = arrayList.size();
int[] array = new int[length];
for (int i = 0; i < length; i++) {
//逐行进行加密
String s = arrayList.get(i);
//对数据进行加密
String result=encrypt(s,pass);
System.out.println("加密后的结果为:"+result);
// System.out.println(encrypt(s, pass));
//将加密后的数据存储到txt文件中。
try {
result=result+"\n";
//重新设置字符串
FileWriter fw = new FileWriter("C:\\Users\\kingback\\Desktop\\龙华老师资料\\上交资料\\第十次上交材料\\result.txt",true);
//fw的第二个参数,设置为true,则为追加模式
fw.write(result,0,result.length());
//执行写入操作
fw.flush();
fw.close();
//关闭写入,关闭文件
} catch (IOException e) {
e.printStackTrace();
}
//获取解密结果
String deResult=decrypt(encrypt(s, pass), pass);
System.out.println("解密后的结果为:"+deResult);
//输出解密结果
}
}
/**
*
* @param sourceString
* @param password
* @return 明文
*/
public static String decrypt(String sourceString,String password) {
char[] p = password.toCharArray(); // 字符串转字符数组
int n = p.length; // 密码长度
char[] c = sourceString.toCharArray();
int m = c.length; // 字符串长度
for (int i = 0; i < m; i++) {
char resultDeChar=Change(c[i]);
c[i] = (char) resultDeChar;
//类型转换
}
return new String(c);
}
/**
* @param sourceString
* @param password
* @return 密文
*/
public static String encrypt(String sourceString,String password) {
char[] p = password.toCharArray(); // 字符串转字符数组
int n = p.length; // 密码长度
char[] c = sourceString.toCharArray();
int m = c.length; // 字符串长度
//在此处进行加密
for (int k = 0; k < m; k++) {
char resultChar=deChange(c[k]);
c[k] = (char) resultChar;
//类型转换
}
return new String(c);
}
/**
* @param sourceChar
* @return 加密后的字符
*/
public static char Change(char sourceChar) {
char c = sourceChar;
int result=(int)sourceChar;
//获取字符的ASCII码值,用数字表示
//执行加密操作
///如果a-y则数值加一
if (result<=121 &&97<=result){
result++;
}
//如果z则数值不变
else if (result==122){
result=97;
}
//类型转换为字符
c=(char)result;
//返回字符型结果
return c;
}
/**
* @param sourceChar
* @return 解密后的字符
*/
public static char deChange(char sourceChar) {
char c = sourceChar;
int result=(int)sourceChar;
//获取字符的ASCII码值,用数字表示
//执行解密操作
if (result<=122 &&98<=result){
result--;
}
//如果是b-z则数值减一
else if (result==97){
result=122;
}
//如果是a则不变
c=(char)result;
//将数字类型强转为字符类型
return c;
}
}
2.2 解密
对于解密部分的代码,我封装了一个decrypt的方法,当我们需要进行解密验证的时候,只需要调用即可。
public static String decrypt(String sourceString,String password) {
char[] p = password.toCharArray(); // 字符串转字符数组
int n = p.length; // 密码长度
char[] c = sourceString.toCharArray();
int m = c.length; // 字符串长度
for (int i = 0; i < m; i++) {
char resultDeChar=Change(c[i]);
c[i] = (char) resultDeChar;
//类型转换
}
return new String(c);
}
/**
* @param sourceString
* @param password
* @return 密文
*/
public static char deChange(char sourceChar) {
char c = sourceChar;
int result=(int)sourceChar;
//获取字符的ASCII码值,用数字表示
//执行解密操作
if (result<=122 &&98<=result){
result--;
}
//如果是b-z则数值减一
else if (result==97){
result=122;
}
//如果是a则不变
c=(char)result;
//将数字类型强转为字符类型
return c;
}