Hutool开源工具包之AES

Hutool官网文档地址:

https://www.hutool.cn/docs/#/

简介

       Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

       Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

        Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。

 

使用

    AES是对称加密算法,加密解密使用的是同一把钥匙。

     项目的pom中引入依赖:

 <dependency>
     <groupId>cn.hutool</groupId>
     <artifactId>hutool-all</artifactId>
     <version>5.8.4</version>
 </dependency>

 官方文档中的demo 

String content = "test中文";

//随机生成密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();

//构建
SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);

//加密
byte[] encrypt = aes.encrypt(content);
//解密
byte[] decrypt = aes.decrypt(encrypt);

//加密为16进制表示
String encryptHex = aes.encryptHex(content);
//解密为字符串
String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);

 问题

       使用Huool的AES算法如何指定公钥key值?

      使用官方的demo采用的是生成随机的key,但是这个这个key我们不知道它生成的随机值是多少?也没有找到可以获取这个生成的随机key值的接口,如有小伙伴知道的话私信我,让我长长见识哈,下面是我自己写的一个utils

package com.dytz.barrier.gate.web.util;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * @author zlf
 * @description:
 * @time: 2022/8/31 11:10
 * 密钥必须为16字节或者16字节的倍数的字节型数据。
 * 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全。
 */
@Slf4j
public class AesUtil {

    private static AES aes = null;

    /**
     * 16字节
     */
    private static String keyStr = "xxxxxxx";
    //长度为16位的盐值
    private static final String IV_KEY = "sdfsdf12345sfsdf";

    static {
        // 构建
        //随机生成密钥
        SecretKeySpec secretKeySpec = new SecretKeySpec(getBytes(keyStr, 16), SymmetricAlgorithm.AES.getValue());
        IvParameterSpec ivParameterSpec = new IvParameterSpec(IV_KEY.getBytes());
        aes = new AES(Mode.CBC, Padding.ZeroPadding, secretKeySpec, ivParameterSpec);
    }

    /**
     * 破解时密匙长度是规定了的
     * 如果密匙长度有问题会报错:Key length not 128/192/256 bits.
     * 意思就比如密匙长度不是16位 就会报错~
     * 所以需要填充密匙长度
     *
     * @param s
     * @param length
     * @return
     */
    private static byte[] getBytes(String s, int length) {
        int fixLength = length - s.getBytes().length;
        if (s.getBytes().length < length) {
            byte[] S_bytes = new byte[length];
            System.arraycopy(s.getBytes(), 0, S_bytes, 0, s.getBytes().length);
            for (int x = length - fixLength; x < length; x++) {
                S_bytes[x] = 0x00;
            }
            return S_bytes;
        }
        return s.getBytes();
    }

    /**
     * 加密
     *
     * @param content
     * @return
     */
    public static String encryptHex(String content) {
        // 加密
        byte[] encrypt = aes.encrypt(content);
        // 加密为16进制表示
        String encryptHex = aes.encryptHex(content);
        return encryptHex;
    }

    /**
     * 解密
     *
     * @param encryptHex
     * @return
     */
    public static String decryptHex(String encryptHex) {
        // 解密为字符串
        String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
        return decryptStr;
    }

    public static void main(String[] args) {
        String content = "test中文";
        log.info("content:{}", content);
        // 加密为16进制表示
        String encryptHex = encryptHex(content);
        log.info("encryptHex:{}", encryptHex.toUpperCase());
        // 解密为字符串
        String decryptStr = decryptHex(encryptHex);
        log.info("decryptStr:{}", decryptStr);
    }

}

       即可直接使用,Hutool工具包里面有很多好用的工具类,可以直接拿来使用,有轮子就不去重复制造轮子,但是可以学习使用各种轮子的code和一些好的设计方法和思想,然后应用到我们自己的项目中来简化代码和提高代码质量,同时也提高了我们的开发产出效率,除非轮子不好用,那就直接修改它的code,否则,都很少去制造轮子,如果项目进度紧的话,等我们制造好轮子,然后项目就《凉凉》了。

 

都说我太胖

满身都是脂肪

背影像一堵墙

 

穿啥也都够呛

小姑娘难找对象

他们没撒谎

最怕你在身旁

你虽美的出柜

可是也求你体谅让一让

挡我阳光

其实我也只吃五谷杂粮

喝口凉水都是营养

别人一天只要吃三回

骗骗你却要翻倍

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值