0


信息安全——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;
    }
}
标签: java ide 网络安全

本文转载自: https://blog.csdn.net/weixin_45454242/article/details/126933582
版权归原作者 LAN¥¥ 所有, 如有侵权,请联系我们删除。

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

还没有评论