Java实现对称加密算法-AES加解密
AES(Advanced Encryption Standard)意思是高级加密标准,是一种区块加密标准。这个标准用来替代原先的DES,且已经被广泛使用。
DES使用56位密钥,所以比较容易被破解。
AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据,相对来说安全很多。
完善的加密算法在理论上是无法破解的,除非使用穷尽法(也称暴力破解)。使用穷尽法破解密钥长度在128位以上的加密数据是不现实的,仅存在理论上的可能性。统计显示,即使使用目前世界上运算速度最快的计算机,穷尽128位密钥也要花上几十亿年的时间,更不用说去破解采用256位密钥长度的AES算法了。
AES是一种对称加密算法,也就是加密和解密使用的是同一把秘钥。
Java实现AES:
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang3.StringUtils;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.SecureRandom;public class AESUtil {private static final String KEY_ALGORITHM = "AES";private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";/*** 指定随机字符串(密码)生成密钥** @param randomKey 加解密的密码* @throws Exception*/public static byte[] getSecretKey(String randomKey) throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM); //秘钥生成器,指定秘钥算法//初始化此密钥生成器,指定AES的秘钥长度为128if (StringUtils.isBlank(randomKey)) { //不指定密码keyGenerator.init(128);} else { //指定密码SecureRandom random = SecureRandom.getInstance("SHA1PRNG");random.setSeed(randomKey.getBytes());keyGenerator.init(128, random);}SecretKey secretKey = keyGenerator.generateKey(); //生成密钥return secretKey.getEncoded();}/*** 加密** @param data 待加密数据* @param key 密钥* @return byte[] 加密数据* @throws Exception*/public static byte[] encrypt(byte[] data, Key key) throws Exception {return encrypt(data, key, DEFAULT_CIPHER_ALGORITHM);}/*** 加密** @param data 待加密数据* @param key 二进制密钥* @return byte[] 加密数据* @throws Exception*/public static byte[] encrypt(byte[] data, byte[] key) throws Exception {return encrypt(data, key, DEFAULT_CIPHER_ALGORITHM);}/*** 加密** @param data 待加密数据* @param key 二进制密钥* @param cipherAlgorithm 加密算法/工作模式/填充方式* @return byte[] 加密数据* @throws Exception*/public static byte[] encrypt(byte[] data, byte[] key, String cipherAlgorithm) throws Exception {Key k = toKey(key);return encrypt(data, k, cipherAlgorithm);}/*** 加密** @param data 待加密数据* @param key 密钥* @param cipherAlgorithm 加密算法/工作模式/填充方式* @return byte[] 加密数据* @throws Exception*/public static byte[] encrypt(byte[] data, Key key, String cipherAlgorithm) throws Exception {Cipher cipher = Cipher.getInstance(cipherAlgorithm); //获取算法cipher.init(Cipher.ENCRYPT_MODE, key); //设置加密模式,并指定秘钥return cipher.doFinal(data); //加密数据}/*** 解密** @param data 待解密数据* @param key 二进制密钥* @return byte[] 解密数据* @throws Exception*/public static byte[] decrypt(byte[] data, byte[] key) throws Exception {return decrypt(data, key, DEFAULT_CIPHER_ALGORITHM);}/*** 解密** @param data 待解密数据* @param key 密钥* @return byte[] 解密数据* @throws Exception*/public static byte[] decrypt(byte[] data, Key key) throws Exception {return decrypt(data, key, DEFAULT_CIPHER_ALGORITHM);}/*** 解密** @param data 待解密数据* @param key 二进制密钥* @param cipherAlgorithm 加密算法/工作模式/填充方式* @return byte[] 解密数据* @throws Exception*/public static byte[] decrypt(byte[] data, byte[] key, String cipherAlgorithm) throws Exception {Key k = toKey(key);return decrypt(data, k, cipherAlgorithm);}/*** 解密** @param data 待解密数据* @param key 密钥* @param cipherAlgorithm 加密算法/工作模式/填充方式* @return byte[] 解密数据* @throws Exception*/public static byte[] decrypt(byte[] data, Key key, String cipherAlgorithm) throws Exception {Cipher cipher = Cipher.getInstance(cipherAlgorithm); //获取算法cipher.init(Cipher.DECRYPT_MODE, key); //设置解密模式,并指定秘钥return cipher.doFinal(data); //解密数据}/*** 转换密钥** @param secretKey 二进制密钥* @return 密钥*/public static Key toKey(byte[] secretKey) {return new SecretKeySpec(secretKey, KEY_ALGORITHM); //生成密钥}public static void main(String[] args) throws Exception {String password = "123456"; //加解密的密码byte[] secretKey = getSecretKey(password);Key key = toKey(secretKey);String data = "AES 对称加密算法";System.out.println("明文 :" + data);byte[] encryptData = encrypt(data.getBytes(), key);String encryptDataHex = Hex.encodeHexString(encryptData); //把密文转为16进制System.out.println("加密 : " + encryptDataHex);byte[] decryptData = decrypt(Hex.decodeHex(encryptDataHex.toCharArray()), key);System.out.println("解密 : " + new String(decryptData));}
}
Java实现对称加密算法-AES加解密相关推荐
- Java与Winform进行AES加解密数据传输的工具类与对应关系和示例
场景 Android+Java中使用Aes对称加密的工具类与使用: Android+Java中使用Aes对称加密的工具类与使用_霸道流氓气质的博客-CSDN博客 上面讲的Java与安卓进行数据传输时使 ...
- Java实现非对称加密算法-RSA加解密
RSA是由三位数学家Rivest.Shamir 和 Adleman 发明的非对称加密算法,这种算法非常可靠,秘钥越长,就越难破解. 目前被破解的最长RSA秘钥是768个二进制位,长度超过768位的秘钥 ...
- Java实现aes加解密
pom文件的依赖 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <depe ...
- 基于Java的SQL Server数据库加解密系统设计与实现
目 录 摘 要 1 ABSTRACT 2 第1章 绪论 3 1.1 数据库加解密系统开发背景 3 1.2 国内外现状 3 1.3 本文的主要工作 4 1.4 论文的组织结构 4 第2章 数据库加密的基 ...
- Java使用AES加解密
Java使用AES加解密 目录 1.1生成密钥 1.2密钥的存储 1.3获取存储的密钥 1.4加解密 1.5使用存储的密钥进行加解密示例 AES是一种对称的加密算法,可基于相同的密钥进行加密和解密.J ...
- java aes 工具类_Java中的AES加解密工具类:AESUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...
- Java code lib aes 加解密
Java aes 加解密 /*** Created by LvJianwei on 2018/2/8.*/import javax.crypto.Cipher; import javax.crypto ...
- 记一次Java AES 加解密 对应C# AES加解密 的一波三折
最近在跟三方对接 对方采用AES加解密 作为一个资深neter Ctrl CV 是我最大的优点 所以我义正言辞的问他们要了demo java demo代码: public class EncryptD ...
- java aes ebc_Delphi XE2+标准AES加解密算法(AES/EBC,CBC/PKCS5Padding-base64)
[实例简介] 实现了AES/ECB/PKCS5Padding.AES/CBC/PKCS5Padding 密钥长度128/192/256bit,密钥0填充.是标准的AES算法,支持在线AES加解密网站互 ...
最新文章
- 【转】测试思考——测试人员需要具备哪些素质?
- 用存储过程生成记录编号
- Linux新建用户图解
- JVM(2)——JVM类加载机制
- 1.10 编程基础之简单排序 06 整数奇偶排序 python
- 一个牛逼的Coder是这样诞生的
- TreeMap源码解析
- 图片相框展示的设计与实现
- 13. 在O(1)时间删除链表节点(C++版本)
- LinGo基本用法总结
- idea更改页面背景颜色设置为护眼颜色
- 计算机折线图教程,excel怎么插入折线图 excel怎么将多个折线图合并
- 磅 英寸 厘米 dpi 像素
- 体验灵魂出窍:错觉延伸人体对自身感觉
- recyclerView + editTextView 编辑图片和文字标题 问题
- TMS320F280049C 学习笔记10 控制率加速器 Control Law Accelerator (CLA) 入门
- 诺基亚联手迪信通 力推内置仙剑三版5230手机
- 华为发布5G“天罡”“巴龙5000”芯片 5G折叠屏手机2月发布
- 新冠「阳了」,如何稳定情绪,做好心理自救?
- div +css 纵向导航