java加密解密练习

1. 实验要求

  1. 设有一段英文文章,为简单起见,仅由26个小写字母、空格、标点符号(引号和逗号)组成,符号集合共29个。现在自定义一种一一映射规则,将这29个符号映射(替代)为同集合中的符号,比如b用k替代、u用v替代、t用s替代、空格用空格替代等等。这样but就被替换为kvs,从而实现了简单加密。试编写一java程序,实现上述替代规则(规则自己定义),从一个txt文件中 读取明文,将加密后的密文重新写到一个新文件中。
  2. 对任务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;
}

在这里插入图片描述

2.3整体运行过程

在这里插入图片描述

发布了44 篇原创文章 · 获赞 37 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_38468077/article/details/100529057