AES加密 + Base64编码

news/2024/7/3 2:47:09

AES 加密

依赖:

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>

加密代码

public class EncryptUtils {
    // AES加密要求key必须要128个比特位(这里需要长度为16,否则会报错)
    private static final String KEY = "1234567890abcd";

    // 算法
    private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";

    /**
     * base 64 encode
     * @param bytes 待编码的byte[]
     * @return 编码后的base 64 code
     */
    private static String base64Encode(byte[] bytes){
        return Base64.encodeBase64String(bytes);
    }

    /**
     * base 64 decode
     * @param base64Code 待解码的base 64 code
     * @return 解码后的byte[]
     * @throws Exception 抛出异常
     */
    private static byte[] base64Decode(String base64Code) throws Exception{
        return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);
    }

    /**
     * AES加密
     * @param content 待加密的内容
     * @param encryptKey 加密密钥
     * @return 加密后的byte[]
     */
    private static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128);
        Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
        return cipher.doFinal(content.getBytes("utf-8"));
    }


    /**
     * AES加密为base 64 code
     *
     * @param content 待加密的内容
     * @param encryptKey 加密密钥
     * @return 加密后的base 64 code
     */
    private static String aesEncrypt(String content, String encryptKey) throws Exception {
        return base64Encode(aesEncryptToBytes(content, encryptKey));
    }

    /**
     * AES解密
     *
     * @param encryptBytes 待解密的byte[]
     * @param decryptKey 解密密钥
     * @return 解密后的String
     */
    private static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128);

        Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
        byte[] decryptBytes = cipher.doFinal(encryptBytes);

        return new String(decryptBytes);
    }


    /**
     * 将base 64 code AES解密
     *
     * @param encryptStr 待解密的base 64 code
     * @param decryptKey 解密密钥
     * @return 解密后的string
     */
    private static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {
        return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
    }
}

说明

通过测试,正常情况下,密码需要设置为16个字符 => 128位。 如果需要将key提升到超过16位,则需要将jdk中的两个文件进行替换

在这里插入图片描述

jar包下载地址

jdk7: https://www.oracle.com/java/technologies/javase-jce7-downloads.html

jdk8: https://www.oracle.com/java/technologies/javase-jce8-downloads.html

博客参考:https://www.sojson.com/blog/249.html

Base64 编码问题

  • base64 加密处理后有回车换行符

base64一行不能超过76个字符,超过就会添加回车换行符。

解决办法: 使用字符串对象的replaceAll方法替换掉\r和\n,具体代码如下:

replaceAll("[\\s*\t\n\r]", "")

Base64转码

完整的BASE64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。

转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲器中剩下的bit用0补足。然后,每次取出6(因为2^6=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。

当原数据长度不是3的整数倍时, 如果最后剩下一个输入数据(原始数据按3个一组,剩下一个),在编码结果后加2个“=”;如果最后剩下两个输入数据(原始数据按3个一组,剩下两个),编码结果后加1个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证数据还原的正确性。

原理查看 https://blog.csdn.net/robertcpp/article/details/51628647

apache commons-net 保中有对应的工具 Base64.

示例:

ASIIC 编码: 
ab => 1100001 1100010 (011000 010110 001000)
ab => YWI=
abcd => YWJjZA==

http://www.niftyadmin.cn/n/3682152.html

相关文章

页面数据缓存

查找更多的相关主题 页面数据缓存 ASP.NET提供了一个相当出色的缓存引擎机制&#xff0c;它允许页面保存和索引HTTP请求所要求的各种各样的对象。ASP.NET的缓存对各个应用来说是私有的&#xff0c;是存储各种对象的存储器。缓存的生存周期取决于应用的生存周期&#xff0c;…

Mysql5.7.6安装和主从配置手册

Mysql5.7.6 安装手册 linux server版本1.下载 http://dev.mysql.com/downloads/mysql/#downloads 2. 检查库文件是否存在&#xff0c;如有删除检查&#xff1a;rpm -qa | grep mysql删除&#xff1a; rpm -e mysql-libs-5.1.52.x86_64 --nodeps3. 检查mysql组和用户是否存在&am…

JDC 的 ACCESS_TOKEN 授权流程

JDC 的 ACCESS_TOKEN 授权流程 这里统一为JDC授权流程。最近在对接国外版的天猫和京东&#xff0c;在对接API直接&#xff0c;授权需要token的获取。像LAZADA&#xff0c;Shopee&#xff0c;和JD Central 这三家的接口&#xff0c;其token的授权流程类似&#xff0c;这里统一记…

MySQL Error--存储inode用完后报设备没有空间

问题描述&#xff1a;磁盘有足够剩余空间&#xff0c;但在创建文件或文件夹时报错&#xff0c;提示“设备没有空间”。 问题原因:当存储设备通过分区格式化为文件系统后&#xff0c;会分为两部分&#xff1a;1、block部分&#xff1a; 存储的最小单位为扇区(Sector)&#xff0c…

页面部分缓存概述

页面部分缓存概述 页面部分缓存允许缓存页的部分内容&#xff0c;其他部分则为动态内容。由于大部分Web页面的某些部分在每一次请求时都需要进行更改&#xff0c;所以&#xff0c;在这种情况下&#xff0c;就只能缓存页面的一部分&#xff0c;即页面部分缓存。 页面部分缓…

Java实现二维数组的排列组合

今天同事在做一个需求的时候&#xff0c;需要设计到二维数组的排列组合为题&#xff0c;就趁这个机会&#xff0c;实现了这个功能&#xff0c;现记录一下&#xff1b; public static void main(String[] args) {List<String[]> list new ArrayList<>();list.add(…

初学linux时遇到的那些哭笑不得的问题

1.终端中无法输入密码&#xff1f; 在终端输入密码&#xff0c;是不会在输入密码的时候看见星号或者圆点符号的。它不会有任何输入密码的视觉指示&#xff0c;也不会有任何光标移动&#xff0c;什么也不显示。 其实是输进去了&#xff0c;只是没有明文显示出来而已。输入完成后…

页面部分缓存

页面部分缓存是指输出缓存页面的某些部分&#xff0c;而不是缓存整个页面内容。实现页面部分缓存有两种机制&#xff1a;一种是将页面中需要缓存的部分置于用户控件&#xff08;.ascx文件&#xff09;中&#xff0c;并且为用户控件设置缓存功能&#xff08;包含用户控件的ASP.N…