使用Java实现AES加密解密

常见加密算法【附JAVA代码案例】 加密算法AES、DES、3DES,RSA 阅读详情
AI摘要

博客介绍了AES高级加密标准,它是美国联邦政府采用的区块加密标准,替代了DES,有5种加密模式和5种填充方式。还提供了在线加密解密工具,给出了Java实现AES加密后数据输出的两种方式及以特定模式为例的使用方式,还可到GitHub查看更多例子。

1. 介绍

AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度。AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特。而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。AES有5种加密模式,分别是ECB、CBC、CTR、OFB、CFB。有5种填充方式,分别是PKCS5Padding、PKCS7Padding、ZeroPadding、ISO10126、Ansix923。

这里提供一个在线进行AES加密解密:http://tool.chacuo.net/cryptaes

2. 具体实现

加密后对数据的输出采用2种方式:Base64、Hex,其中Base64使用的是Android SDK里面的API,具体代码如下:

package com.fantasy.blogdemo.crypto.utils;

import android.util.Base64;

import com.fantasy.blogdemo.utils.ConvertUtils;

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

/**
 * AES加解密工具类
 * <pre>
 *     author  : Fantasy
 *     version : 1.0, 2019-07-12
 *     since   : 1.0, 2019-07-12
 * </pre>
 */
public class AESUtils {
    private static final String CHARSET = "UTF-8";

    /**
     * 加密,输出Base64字符串密文
     *
     * @param data           明文
     * @param key            密钥
     * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:AES/CBC/PKCS5Padding,
     *                       相关取值可以查看下列两个文档:
     *                       <ul>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
     *                       中的 javax.crypto.Cipher</li>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
     *                       Standard Algorithm Name Documentation</a></li>
     *                       </ul>
     * @param iv             偏移量,ECB模式不需要,传null
     * @return 密文
     * @throws Exception 异常
     */
    public static String encryptBase64(String data, String key, String transformation, String iv) throws Exception {
        return Base64.encodeToString(handle(data.getBytes(CHARSET), key, transformation, iv, true), Base64.NO_WRAP);
    }

    /**
     * 解密,密文为Base64字符串
     *
     * @param data           密文
     * @param key            密钥
     * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:AES/CBC/PKCS5Padding,
     *                       相关取值可以查看下列两个文档:
     *                       <ul>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
     *                       中的 javax.crypto.Cipher</li>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
     *                       Standard Algorithm Name Documentation</a></li>
     *                       </ul>
     * @param iv             偏移量,ECB模式不需要,传null
     * @return 明文
     * @throws Exception 异常
     */
    public static String decryptBase64(String data, String key, String transformation, String iv) throws Exception {
        return new String(handle(Base64.decode(data, Base64.NO_WRAP), key, transformation, iv, false), CHARSET);
    }

    /**
     * 加密,输出十六进制字符串密文
     *
     * @param data           明文
     * @param key            密钥
     * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:AES/CBC/PKCS5Padding,
     *                       相关取值可以查看下列两个文档:
     *                       <ul>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
     *                       中的 javax.crypto.Cipher</li>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
     *                       Standard Algorithm Name Documentation</a></li>
     *                       </ul>
     * @param iv             偏移量,ECB模式不需要,传null
     * @return 密文
     * @throws Exception 异常
     */
    public static String encryptHex(String data, String key, String transformation, String iv) throws Exception {
        return ConvertUtils.bytesToHexString(handle(data.getBytes(CHARSET), key, transformation, iv, true));
    }

    /**
     * 解密,密文为十六进制字符串
     *
     * @param data           密文
     * @param key            密钥
     * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:AES/CBC/PKCS5Padding,
     *                       相关取值可以查看下列两个文档:
     *                       <ul>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
     *                       中的 javax.crypto.Cipher</li>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
     *                       Standard Algorithm Name Documentation</a></li>
     *                       </ul>
     * @param iv             偏移量,ECB模式不需要,传null
     * @return 明文
     * @throws Exception 异常
     */
    public static String decryptHex(String data, String key, String transformation, String iv) throws Exception {
        return new String(handle(ConvertUtils.hexStringToBytes(data), key, transformation, iv, false), CHARSET);
    }

    /**
     * 处理数据,加密或解密
     *
     * @param data           数据
     * @param key            密钥
     * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:<i>AES/CBC/PKCS5Padding</i>。<br/>
     *                       相关取值可以查看下列两个文档:
     *                       <ul>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>
     *                       中的 javax.crypto.Cipher</li>
     *                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">
     *                       Standard Algorithm Name Documentation</a></li>
     *                       </ul>
     * @param iv             偏移量,ECB模式不需要,传null
     * @param isEncrypt      如果是加密,则为true;如果为解密,则为false
     * @return 加密后或解密后的字节数组
     * @throws Exception 异常
     */
    private static byte[] handle(byte[] data, String key, String transformation, String iv,
                                 boolean isEncrypt) throws Exception {
        SecretKey secretKey = new SecretKeySpec(key.getBytes(CHARSET), "AES"); // 构造密钥
        Cipher cipher = Cipher.getInstance(transformation);
        if (iv == null || iv.length() == 0) {
            cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, secretKey);
        } else {
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes(CHARSET));
            cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, secretKey, ips);
        }
        return cipher.doFinal(data);
    }

}

3. 使用方式

这里以"AES/CBC/PKCS5Padding"模式为例

String transformation = "AES/CBC/PKCS5Padding";
String key = "QSfg26hg433BV42adsfDKdJN234SD523"; // 密钥长度16位、24位、32位
String iv = "d480IfADFd39f0NK"; // IV偏移量的长度必须为16位
String data = "blogDemo123"; // 待加密的数据

// 加密结果:QXvBCdQDgTB446IOFukkPA==
String result1 = AESUtils.encryptBase64(data, key, transformation, iv);

// 解密结果:blogDemo123
String result2 = AESUtils.decryptBase64(result1, key, transformation, iv);

想看更多例子可以到我的GitHub上面看看BlogDemo。

 

如果想进一步交流和学习的同学,可以加一下QQ群哦!

前后端AES加密解密,前端使用CryptoJS,后端Java实现 前端使用CryptoJS 下载CryptoJS, Github : https://github.com/brix/crypto-js 一、使用CBC模式 1、前端实现 引入JS &amp;lt;script src=&quot;./js/crypto-js.js&quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&quot;./js/aes.js&qu 阅读详情

相关推荐

AES(高级加密标准):AES的加解密过程分析

AES, 或称高级加密标准,是由美国国家标准与技术研究院(NIST)在2001年正式采纳的一种对称密钥加密算法。它取代了之前的DES和3DES标准,成为全球广泛使用的加密标准。AES的开发始于1997年,由比利时密码学家Joan Daemen和Vincent Rijmen设计,最初称为Rijndael算法。NIST在经过一系列的评估和测试后,选择了Rijndael作为新的加密标准,主要因为它在安全性、效率、灵活性和易于实现方面表现优异。

kkchenjj的博客 2870

Java实现加密(一)AES加解密

AES:高级加密标准(Advanced Encryption Standard)是美国联邦政府采用的一种区块加密标准,是目前最流行的一种对称加密算法。是用来替代DES的新一代分组加密算法。AES支持三种长度的密钥:128位、192位、256位。

ACGkaka的博客 4万+

使用 AES 对称加密算法对视频文件进行加密解密(C++ 及 Java 实现)

因为项目需要,最近学习了一下 AES 加密算法,并分别用 C++ 和 Java 实现了这个算法。用 Java 实现是因为在 Android 项目上,需要对视频文件进行 AES 加密解密,用 C++ 实现是因为服务器需要对被加密过的视频进行解密。 对视频文件进行加密解密的规则非常简单,加密时以 byte[] 的形式读取视频文件开头的一小段数据,一般 256byte 就足够了,然后对这个 byte[] 进行 AES 加密,把得到的密文替换到视频文件开头的 256byte 就可以了。因为视频文件的头被加密了,所

愿君出走半生,归来时仍是少年 5749

Java使用AES实现数据加密解密

常用的java算法有:对称加密算法、非对称加密算法、消息摘要算法、数字签名算法、密钥交换算法

m0_58111460的博客 1万+

Java使用AES算法并指定密钥种子实现加密解密

Java使用AES指定密钥实现加密解密 import org.apache.commons.codec.binary.Hex; import javax.crypto.Cipher; import java.nio.charset.StandardCharsets; import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom; public class PasswordCi

zhengzaifeidelushang的博客 1341

aes加密算法 五种模式

使用ECB,CBC,CFB,OFB,CTR五种模式进行AES加密解密

java hex decodehex_java使用Hex编码解码实现Aes加密解密功能示例

本文实例讲述了java使用Hex编码解码实现Aes加密解密功能。分享给大家供大家参考,具体如下:这里的Aes加密解密方法使用Hex进行了编码解码package com.baidu.wallet.bdwallet.utils;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;imp...

weixin_39643338的博客 3476

避坑指南:SAP CO模块维护成本控制范围的5个常见错误及解决方法

本文深入剖析了SAP CO模块中维护成本控制范围时最易犯的5个常见错误,包括货币参数配置不当、标准层次结构缺失、财政年度变式不一致、功能激活遗漏及集成参数设置错误。重点针对事务码OKKP的配置,提供了详细的排查步骤与实战解决方案,帮助顾问有效规避陷阱,确保成本核算体系稳定运行。

stone的博客 234

java aestool_Java使用Hutool实现AES、DES加密解密的方法

在Java世界中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。介绍AES和DES同属对称加密算法,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中...

weixin_32770541的博客 720

用Matlab和CVX搞定原子范数最小化:一个信号处理小白的避坑实践

本文详细介绍了如何使用Matlab和CVX实现原子范数最小化(Atomic norm minimization),特别适合信号处理初学者。从CVX安装配置、核心代码解析到实战中的典型问题与解决方案,提供了全面的避坑指南。通过具体案例展示了原子范数在频率估计和DOA估计中的优势,并给出性能优化策略和可视化方法。

weixin_28731231的博客 233

NXP KW45开发实战:如何在MCUXpresso IDE中正确配置J-Link并解决设备识别问题

本文详细介绍了在MCUXpresso IDE中配置J-Link以支持NXP KW45无线MCU开发的实战指南。从环境准备到J-Link深度配置,再到烧录流程优化和高级调试技巧,帮助开发者高效解决设备识别问题并提升开发效率。特别推荐使用JLinkRemoteServer.exe进行多设备并行调试,并提供了烧录速度优化和低功耗调试的实用技巧。

gray5的博客 864

java decodehex_java使用Hex编码解码实现Aes加密解密功能示例

本文实例讲述了java使用Hex编码解码实现Aes加密解密功能。分享给大家供大家参考,具体如下:这里的Aes加密解密方法使用Hex进行了编码解码package com.baidu.wallet.bdwallet.utils;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;imp...

weixin_40003451的博客 1780

别再纠结了!手把手教你根据项目需求选对目标检测框架(MMDetection/Detectron2/YOLOv8实战对比)

本文详细对比了三大目标检测框架MMDetection、Detectron2和YOLOv8的适用场景与实战技巧,帮助开发者根据项目需求精准选型。从毕业设计到工业落地,分析不同场景下的核心需求与框架优势,提供决策树和避坑指南,确保技术选型与项目目标高度匹配。

weixin_30342209的博客 554

Java使用Hutool实现AES、DES加密解密

为什么80%的码农都做不了架构师?>>> ...

weixin_34026484的博客 4990

NFS服务器配置与autofs自动挂载

NFS服务器配置autofs自动挂载 环境: hostname ip OS server 192.168.220.138 centos7 client 192.168.220.139 centos7 一、NFS概述 NFS(Network File System)网络文件系统。最大功能就是通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。 二、端口 [root@se...

DoloresOOO的博客 1026

TSP:车为什么能和云端交互?

TSP:车为什么能和云端交互?

天赐好车的博客 413

使用java,实现最简单的AES加密解密

使用java,实现最简单的AES加密解密 话不多说,直接上代码: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class Test { public static final String CHARSET_NAME = "utf-8"; public stat

weixin_42286276的博客 702

动力学约束下的运动规划算法——Kinodynamic RRT*算法

动力学约束下的运动规划算法——Kinodynamic RRT*算法

慕羽★的博客 6751

java aestool_Java使用Hutool实现AES、DES加密解密

摘要: 在Java世界中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。介绍AES和DES同属对称加密算法,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加...

weixin_39752215的博客 399

华为OD面试八股文嵌入式C语言基础问题及答案(一)

本文总结了C语言编程中的10个关键知识点:1.宏定义MIN的实现方法;2.嵌入式无限循环的两种写法;3.变量a的8种不同定义方式;4.static关键字的三种作用;5.const关键字的含义和使用场景;6.volatile关键字的含义及三个应用实例;7.变量存储位置(栈区、静态区、堆区);8.32位系统指针位数;9.局部与全局变量重名规则;10.引用与指针的三点区别。这些内容涵盖了宏定义、变量声明、存储类别、指针等C语言核心概念,对嵌入式开发和系统编程具有重要参考价值。

m0_50382756的博客 160

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

nodejs和java使用AES实现相同的加密解密方式

由于开发项目使用Java做的后台管理系统,而用户使用平台为nodejs编写,故需要实现两个平台的相同加密解密方式,我这里是使用了AES进行实现。 nodejs 定义 //引入组件 var crypto = require('crypto'); //加密 var aesEncrypt = function (data, secretKey) { var cipher = crypto.createCipher('aes-128-ecb', secretKey); return cipher.updat

changyana的博客 2125

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Node Java相互使用AES-256-CBC对数据进行加密解密实现

目录Node代码Java代码 Node代码 /** * 加密,解密方法 * */ let crypto = require('crypto'); /** * 加密解密方式 */ let algorithm = 'aes-256-cbc'; let key = '9815c9e69268bc2fc2085c1lc6q75a42'; let charset = 'utf8'; let cipherEncoding = 'base64'; let iv = '9183296589LSCQEG'.

Apollo 2922

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

.Net Core 使用IKVM实现Java AES加密解密

.Net Core 使用IKVM实现Java AES加密解密

Potato33的博客 1240

java实现aes-128-ecb_java使用AES加密解密 AES-128-ECB加密

import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;/**** @author Administrator**/public class AES {// 加密public static String Encrypt(String...

weixin_31650287的博客 1083
上一篇: 使用Java实现3DES加密解密
下一篇: Android为页面添加水印
Fantasy丶Lin
博客等级 码龄11年 92粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值