Java实现AES加密

生成秘钥简单粗暴

这边AES秘钥默认为128位,获得无政策权限后可为192或256,因此对应字符为16位,直接生成16位的秘钥

import java.io.UnsupportedEncodingException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**

* @ClassName: SecretKeyUtils

* 各秘钥生成

* @author zhupig3028

* @date 2022年5月10日

*/
public class SecretKeyUtils {

    /** AES秘钥 */
    private static final String AES_ALGORITHM = "AES";

    /** 3DES秘钥 */
    private static final String DES_ALGORITHM = "DESede";

    /** 秘钥生成来源 */
    public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    /**
     * 生成AES密钥对象
     * @throws NoSuchAlgorithmException
     */
    public static String generateAESKey() throws NoSuchAlgorithmException, UnsupportedEncodingException {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < 16; i++) {
            sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
        }
        return sb.toString();
    }

    /**
     * 生成3DES密钥对象
     */
    public static String generate3DESKey() {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < 24; i++) {
            sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
        }
        return sb.toString();
    }

    /**
     * 随机生成RSA秘钥
     * @throws NoSuchAlgorithmException
     */
    public static Map genKeyPair() throws NoSuchAlgorithmException {
        HashMap stringStringHashMap = new HashMap<>();
        // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        // 初始化密钥对生成器,密钥大小为96-1024位
        keyPairGen.initialize(1024,new SecureRandom());
        // 生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        // 得到私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        // 得到公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        String publicKeyString = new String(Base64.getEncoder().encodeToString(publicKey.getEncoded()));
        // 得到私钥字符串
        String privateKeyString = new String(Base64.getEncoder().encodeToString((privateKey.getEncoded())));
        // 将公钥和私钥保存到Map
        //0表示公钥
        stringStringHashMap.put("0",publicKeyString);
        //1表示私钥
        stringStringHashMap.put("1",privateKeyString);
        return stringStringHashMap;
    }

},>,string>

Java实现AES加解密

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import java.util.Base64;
/**

* @ClassName: AESUtils

* @Description: AES 对称算法加密/解密工具类

* @author zhupig3028

* @date 2022年5月10日

*/
public class AESUtils {

    /**
     * 加解密统一编码方式
     */
    private final static String ENCODING = "utf-8";

    /**
     * 加解密方式
     */
    private final static String ALGORITHM  = "AES";

    /**
     *加密模式及填充方式
     */
    private final static String PATTERN = "AES/ECB/pkcs5padding";

    /**
     * AES加密
     * @param plainText
     * @param key
     * @return
     * @throws Exception
     */
    public static String encrypt(String plainText, String key) throws Exception {
        if (key == null) {
            System.out.print("Key为空null");
            return null;
        }
        // 判断Key是否为16位
        if (key.length() != 16) {
            System.out.print("Key长度不是16位");
            return null;
        }
        SecretKey secretKey = new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM);
        // AES加密采用pkcs5padding填充
        Cipher cipher = Cipher.getInstance(PATTERN);
        //用密匙初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        //执行加密操作
        byte[] encryptData = cipher.doFinal(plainText.getBytes(ENCODING));
        return Base64.getEncoder().encodeToString(encryptData);
    }

    /**
     * AES解密
     * @param plainText
     * @param key
     * @return
     * @throws Exception
     */
    public static String decrypt(String plainText, String key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM);
        // 获取 AES 密码器
        Cipher cipher = Cipher.getInstance(PATTERN);
        // 初始化密码器(解密模型)
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        // 解密数据, 返回明文
        byte[] encryptData = cipher.doFinal(Base64.getDecoder().decode(plainText));
        return new String(encryptData,ENCODING);
    }

}

Original: https://www.cnblogs.com/zhupig3028/p/16259271.html
Author: 霸王龙的肚兜
Title: Java实现AES加密

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/569559/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • uniapp原生tabbar设置并添加数字角标或小红点提示

    uniapp配置并设置原生tabbar,原生tabbar基本够用,没必要去用一些比较难配置的插件 //原生tabbar设置在pages.json里面添加如下配置 “ta…

    Java 2023年6月14日
    076
  • Java中Arrays数组工具类的使用全解

    本文几乎涵盖了所有的Arrays工具类( &#x57FA;&#x4E8E;Java 11 )的方法以及使用用例,一站式带你了解Arrays类的用法,希望对大家有帮助…

    Java 2023年6月7日
    085
  • Qt学习笔记

    联系方式 QQ: 2653728884 ,加Q请注明添加原因! Original: https://www.cnblogs.com/arminker/p/5121596.htmlA…

    Java 2023年6月6日
    087
  • 重写并自定义依赖的原生的Bean方法

    转载请注明出处: 在项目开发过程中,往往是直接应用很多jar包中依赖且声明好的Bean,拿来即用,但很多场景也需要对这些原生的Bean 进行自定义,定制化封装,这样在项目使用的过程…

    Java 2023年6月8日
    072
  • 优雅的代码从现在开始

    个人见解: 写代码前 构思明白, 想明白,想全 写着写着都是在写相同的代码,改动麻烦 看到不好的就立马让他优雅 学习别人是如何优雅的 便于维护,避免重复代码,便于开发 提取公共函数…

    Java 2023年6月14日
    080
  • Spring+SpringBoot+SpringMVC学习笔记(狂神版)

    Spring狂神笔记 SpringBoot狂神笔记 SpringMVC狂神笔记 Original: https://www.cnblogs.com/pbinlog/p/140359…

    Java 2023年6月5日
    052
  • Java学习 (17) Java数组篇(01)数组定义&数组声明和创建以及内存分析

    数组的定义 数组的声明和创建 内存分析 语法实例 1.静态初始化 2.动态初始化 3.数组的默认初始化 数组的定义 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据…

    Java 2023年6月8日
    086
  • java 代码的良好习惯

    有很多书籍提到了代码开发的良好习惯,但是自己看过后,在开发中并不能每次都想起来。在此处开贴做笔记,以后自己开发的代码,必须符合。 不要在一个代码块的开头把局部变量一次性都声明了(这…

    Java 2023年5月29日
    071
  • 【JAVA面试】java面试题整理(4)

    java面试题整理(4) JAVA常考点4 文件夹 1、 Set集合怎样保证不反复 1 2、Java中Integer型和int型的差别 3 3、接口能够继承接口吗?抽象类能够继承接…

    Java 2023年5月29日
    065
  • 04-MyBatisPlus条件构造器

    一、wapper介绍 Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapp…

    Java 2023年6月15日
    091
  • IDEA 设置文件编码

    打开设置,快捷键 CTRL+ALT+S或点击设置小齿轮。 建议设置成这样,统一编码,配置文件自动转换 ascii 也勾上。最后OK。 对单个文件进行设置编码,在IDEA主窗口右下角…

    Java 2023年6月7日
    0126
  • 多线程JUC并发篇常见面试详解

    @ 1、JUC 简介 2、线程和进程 3、并非与并行 4、线程的状态 5、wait/sleep的区别 6、Lock 锁(重点) 1、Lock锁 2、公平非公平: 3、Reentra…

    Java 2023年6月5日
    0124
  • 【Java分享客栈】一个包装过简历的新同事写完微信支付引起事故后果断离职了

    挺长时间没发文了,因为公司有一个紧急项目要赶进度,加班如吃饭喝水,久违的进入到码农的状态。 之所以抽空来发个文,是这个项目才刚上线,时间不长却因为一位新同事的代码引起了生产环境的事…

    Java 2023年6月9日
    069
  • maven概述和maven依赖管理的概念以及一件构成的概念

    我们的项目,往往都要经历编译、测试、运行、打包、安装 ,部署等一系列过程。 什么是构建? 指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个…

    Java 2023年6月6日
    083
  • SpringBoot 2.x 集成QQ邮箱、网易系邮箱、Gmail邮箱发送邮件

    在Spring中提供了非常好用的 JavaMailSender接口实现邮件发送,在SpringBoot的Starter模块中也为此提供了自动化配置。 项目源码已托管在Gitee-S…

    Java 2023年5月30日
    070
  • JAVA8新特性–集合流操作Stream

    Stream类全路径为:java.util.stream.Stream对Stream的描述,引用其他文章中觉得比较好的介绍: Java 8 中的 Stream 是对集合(Colle…

    Java 2023年5月29日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球