IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> [2021-09-19]利用CryptoAPI加解密编程接口写一个简单的加解密程序 -> 正文阅读

[Java知识库][2021-09-19]利用CryptoAPI加解密编程接口写一个简单的加解密程序

利用CryptoAPI加解密编程接口写一个简单的加解密程序

菜狗依旧觉得不简单,还是侵删~

了解CryptoAPI编程(crypto_api_doc.pdf),尝试用CryptoAPI或OpenSSL或其它加解密编程接口写一个简单的加解密程序(完成本地文件的加密解密,参考SFT的本地文件加解密功能,要有界面),开发工具不限。

开发环境:IDEA + Java1.8 + crypto库 + exe4j(将jar打包成可执行文件)

缺陷:打包好的exe文件,直接运行,会有中文乱码的问题出现,但是在IDEA中直接运行时不存在问题,不晓得是为什么。

运行界面(主要):

img

img

img

img

img

主要代码:

import javax.crypto.spec.*;
import javax.swing.*;
import java.awt.event.*;
import javax.crypto.*;
import java.io.*;
import java.security.*;
import java.util.*;

class cryptoAPI {
    private JButton button1;
    private JButton button2;
    private JPanel panel1;
    public static String key;
    public static String iv;

    public static void main(String[] args) {
        //秘钥
        key  = generateAESKey();
        //向量
        iv = generateAESIv();
        //加密
        JFrame frame = new JFrame("cryptoAPI加解密");
        frame.setSize(400,90);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel1 = new JPanel();
        panel1.setSize(400,90);
        JButton button1 =  new JButton("加密");
        button1.addActionListener(new encryptListener());
        JButton button2 =  new JButton("解密");
        button2.addActionListener(new decryptListener());
        panel1.add(button1);
        panel1.add(button2);
        frame.setContentPane(panel1);
        frame.setVisible(true);
    }

    static class encryptListener implements ActionListener{
        JFrame frame;

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("加密");
            JFileChooser chooser = new JFileChooser(".");
            chooser.showOpenDialog(frame);
            String filePath = chooser.getSelectedFile().getAbsolutePath();
            System.out.println(filePath);
            //读取原文
            //String context = "当我们创建一个node项目,意味着创建一个module模块,这个模块的描述文件,叫package.json。";
            File file = new File(filePath);
            FileReader fileReader = null;
            try {
                fileReader = new FileReader(file);
            } catch (FileNotFoundException fileNotFoundException) {
                fileNotFoundException.printStackTrace();
            }
            BufferedReader br = new BufferedReader(fileReader);
            StringBuilder sb = new StringBuilder();
            String temp = "";
            while (true) {
                try {
                    if (!((temp = br.readLine()) != null)) break;
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
                // 拼接换行符
                sb.append(temp + "\n");
            }
            try {
                br.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
            String context = sb.toString();
//加密
            String encryptContext = null;
            try {
                encryptContext = encryptAES(context.getBytes(),key,iv);
            } catch (NoSuchPaddingException noSuchPaddingException) {
                noSuchPaddingException.printStackTrace();
            } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
                noSuchAlgorithmException.printStackTrace();
            } catch (InvalidKeyException invalidKeyException) {
                invalidKeyException.printStackTrace();
            } catch (BadPaddingException badPaddingException) {
                badPaddingException.printStackTrace();
            } catch (IllegalBlockSizeException illegalBlockSizeException) {
                illegalBlockSizeException.printStackTrace();
            } catch (InvalidAlgorithmParameterException invalidAlgorithmParameterException) {
                invalidAlgorithmParameterException.printStackTrace();
            }
            System.out.println("原文:"+context);

//将原文清空
            try {
                if(!file.exists()) {
                    file.createNewFile();
                }
                FileWriter fileWriter =new FileWriter(file);
                fileWriter.write("");
                fileWriter.flush();
                fileWriter.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
            System.out.println("清空成功");
            System.out.println("密文:"+encryptContext);

//        将新的密文写入
            try {
                if(!file.exists()) {
                    file.createNewFile();
                }
                FileWriter fileWriter =new FileWriter(file);
                fileWriter.write(encryptContext);
                fileWriter.flush();
                fileWriter.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }

    static class decryptListener implements ActionListener{
        JFrame frame;

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("解密");
            JFileChooser chooser = new JFileChooser(".");
            chooser.showOpenDialog(frame);
            String filePath = chooser.getSelectedFile().getAbsolutePath();
            System.out.println(filePath);
            //读取原文
            //String context = "当我们创建一个node项目,意味着创建一个module模块,这个模块的描述文件,叫package.json。";
            File file = new File(filePath);
            FileReader fileReader = null;
            try {
                fileReader = new FileReader(file);
            } catch (FileNotFoundException fileNotFoundException) {
                fileNotFoundException.printStackTrace();
            }
            BufferedReader br = new BufferedReader(fileReader);
            StringBuilder sb = new StringBuilder();
            String temp = "";
            while (true) {
                try {
                    if (!((temp = br.readLine()) != null)) break;
                } catch (IOException exception) {
                    exception.printStackTrace();
                }
                sb.append(temp);
            }
            try {
                br.close();
            } catch (IOException exception) {
                exception.printStackTrace();
            }
            String encryptContext = sb.toString();

            //解密
            String decryptContext = null;
            try {
                decryptContext = decryptAES(encryptContext.getBytes(),key,iv);
            } catch (NoSuchPaddingException noSuchPaddingException) {
                noSuchPaddingException.printStackTrace();
            } catch (NoSuchAlgorithmException noSuchAlgorithmException) {
                noSuchAlgorithmException.printStackTrace();
            } catch (InvalidKeyException invalidKeyException) {
                invalidKeyException.printStackTrace();
            } catch (BadPaddingException badPaddingException) {
                badPaddingException.printStackTrace();
            } catch (IllegalBlockSizeException illegalBlockSizeException) {
                illegalBlockSizeException.printStackTrace();
            } catch (InvalidAlgorithmParameterException invalidAlgorithmParameterException) {
                invalidAlgorithmParameterException.printStackTrace();
            } catch (UnsupportedEncodingException unsupportedEncodingException) {
                unsupportedEncodingException.printStackTrace();
            }

            System.out.println("原文:"+encryptContext);

//将原文清空
            try {
                if(!file.exists()) {
                    file.createNewFile();
                }
                FileWriter fileWriter =new FileWriter(file);
                fileWriter.write("");
                fileWriter.flush();
                fileWriter.close();
            } catch (IOException exception) {
                exception.printStackTrace();
            }
            System.out.println("清空成功");
            System.out.println("密文:"+encryptContext);

//        将新的密文写入
            try {
                if(!file.exists()) {
                    file.createNewFile();
                }
                FileWriter fileWriter =new FileWriter(file);
                fileWriter.write(decryptContext);
                fileWriter.flush();
                fileWriter.close();
            } catch (IOException exception) {
                exception.printStackTrace();
            }

            System.out.println("解密文:"+decryptContext);
        }
    }

    static class ShowDialogLintener extends MouseAdapter {
        JFrame frame;

        public void ShowDialogLintener() {

        }

        @Override
        public void mouseClicked(MouseEvent arg0) {
            super.mouseClicked(arg0);
            JFileChooser chooser = new JFileChooser(".");
            chooser.showOpenDialog(frame);
            String filePath = chooser.getSelectedFile().getAbsolutePath();
            System.out.println(filePath);
        }
    }

    private void createUIComponents() {
        // TODO: place custom component creation code here
    }

    /**
     * 生成秘钥,返回BASE64 处理之后的密钥字符串
     */
    public static String generateAESKey(){
        UUID uuid = UUID.randomUUID();
        String aesKey = Base64.getEncoder().encodeToString(uuid.toString().getBytes()).substring(2,34);
        return aesKey;
    }
    /**
     * 获得一个初始化向量,返回长度为16字节大小的BASE64编码字符串
     * 至于为何要这个iv向量,因为本文使用的是CBC模式
     */
    public static String generateAESIv(){
        UUID uuid = UUID.randomUUID();
        String iv = Base64.getEncoder().encodeToString(uuid.toString().getBytes()).substring(2,18);
        return iv;
    }
    /**
     * 加密
     * @param content 待加密内容
     * @param secretKeyStr 加密使用的 AES 密钥,BASE64 编码后的字符串
     * @param iv 初始化向量,长度为 16 个字节
     * @return 加密后的密文,进行 BASE64 处理之后返回
     */
    public static String encryptAES(byte[] content, String secretKeyStr, String iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {
        // 获得一个加密规则 SecretKeySpec
        SecretKeySpec secretKeySpec = new SecretKeySpec(secretKeyStr.getBytes(), "AES");
        // 获得加密算法实例对象 Cipher
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); //"算法/模式/补码方式"
        // 获得一个 IvParameterSpec
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());  // 使用 CBC 模式,需要一个向量 iv, 可增加加密算法的强度
        // 根据参数初始化算法
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);

        // 执行加密并返回经 BASE64 处助理之后的密文
        return Base64.getEncoder().encodeToString(cipher.doFinal(content));
    }

    /**
     * 解密
     * @param content: 待解密内容,是 BASE64 编码后的字节数组
     * @param secretKeyStr: 解密使用的 AES 密钥,BASE64 编码后的字符串
     * @param iv: 初始化向量,长度 16 字节,16*8 = 128 位
     * @return 解密后的明文,直接返回经 UTF-8 编码转换后的明文
     */
    public static String decryptAES(byte[] content, String secretKeyStr, String iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, UnsupportedEncodingException {
        // 密文进行 BASE64 解密处理
        byte[] contentDecByBase64 = Base64.getDecoder().decode(content);
        // 获得一个 SecretKeySpec
        // SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode(secretKeyStr), "AES");
        SecretKeySpec secretKeySpec = new SecretKeySpec(secretKeyStr.getBytes(), "AES");
        // 获得加密算法实例对象 Cipher
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); //"算法/模式/补码方式"
        // 获得一个初始化 IvParameterSpec
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
        // 根据参数初始化算法
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        // 解密
        return new String(cipher.doFinal(contentDecByBase64), "utf8");
    }

}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:39:09  更:2021-09-20 15:40:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:56:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码