AES高级加密标准简析
1 AES高级加密标准简介
1.1 概述
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
1.2 发展历史
1997年9月12日,美国联邦登记处公布了正式征集AES候选算法的通告。对AES的基本要求是: 比三重DES快、至少与三重DES一样安全、数据分组长度为128比特、密钥长度为128/192/256比特。
1.3 算法原理
1.4 算法应用
2 java代码实现
package xin.dreaming.aes; import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
public class AESUtils { /**
* 生成随机密钥
*
* @param size
* 位数
* @return
*/
public static String generateRandomKey(int size) {
StringBuilder key = new StringBuilder();
String chars = "0123456789ABCDEF";
for (int i = 0; i < size; i++) {
int index = (int) (Math.random() * (chars.length() - 1));
key.append(chars.charAt(index));
}
return key.toString();
} /**
* AES加密
*
* @param plainBytes
* 明文字节数组
* @param keyBytes
* 对称密钥字节数组
* @param useBase64Code
* 是否使用Base64编码
* @param charset
* 编码格式
* @return byte[]
*/
public static byte[] encryptAES(byte[] plainBytes, byte[] keyBytes, boolean useBase64Code, String charset) throws Exception {
String cipherAlgorithm = "AES/CBC/PKCS5Padding";
String keyAlgorithm = "AES";
String IV = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; try {
Cipher cipher = Cipher.getInstance(cipherAlgorithm);
SecretKey secretKey = new SecretKeySpec(keyBytes, keyAlgorithm);
IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec); byte[] encryptedBlock = cipher.doFinal(plainBytes); if (useBase64Code) {
return Base64.encodeBase64String(encryptedBlock).getBytes(charset);
} else {
return encryptedBlock;
}
} catch (Exception e) {
e.printStackTrace();
throw new Exception("AES加密失败");
}
} /**
* AES解密
*
* @param cryptedBytes
* 密文字节数组
* @param keyBytes
* 对称密钥字节数组
* @param useBase64Code
* 是否使用Base64编码
* @param charset
* 编码格式
* @return byte[]
*/
public static byte[] decryptAES(byte[] cryptedBytes, byte[] keyBytes, boolean useBase64Code, String charset) throws Exception {
String cipherAlgorithm = "AES/CBC/PKCS5Padding";
String keyAlgorithm = "AES";
String IV = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; byte[] data = null; // 如果是Base64编码的话,则要Base64解码
if (useBase64Code) {
data = Base64.decodeBase64(new String(cryptedBytes, charset));
} else {
data = cryptedBytes;
} try {
Cipher cipher = Cipher.getInstance(cipherAlgorithm);
SecretKey secretKey = new SecretKeySpec(keyBytes, keyAlgorithm);
IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes()); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec); byte[] decryptedBlock = cipher.doFinal(data); return decryptedBlock;
} catch (Exception e) {
e.printStackTrace();
throw new Exception("AES解密失败");
}
} /**
* BASE64加密
*
* @param key
* @return
* @throws Exception
*/ @Test
public void aesTest() throws Exception{
String value ="DREAMING.XIN";
//生成随机AES对称密钥
String keyStr = generateRandomKey(16);
byte[] keyBytes = keyStr.getBytes("UTF-8"); byte[] encryptAES = encryptAES(value.getBytes(), keyBytes, true, "UTF-8"); System.out.println("AES加密后数据: "+new String(encryptAES)); /*String encodeBase64String = Base64.encodeBase64String(encryptAES); System.out.println("先AES后BASE64: "+encodeBase64String); byte[] decodeBase64 = Base64.decodeBase64(encodeBase64String);*/ byte[] decryptAES = decryptAES(encryptAES, keyBytes, true, "UTF-8"); System.out.println("AES减密后数据: "+ new String(decryptAES)); } }
运行结果:

参考:
AES高级加密标准简析的更多相关文章
- 高级加密标准(英语:Advanced Encryption Standard,缩写:AES)
2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.
- AES(高级加密)
AES(高级加密) #3.6安装 pip3 install pycryptodome #mac pip3 install pycrypto a. 事例: ####################### ...
- Aes加密算法加密模式介绍
本文转自:https://www.jianshu.com/p/582d3a47729a AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中 ...
- PHP AES的加密解密
AES加密算法 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...
- 使用Aes对称加密解密Web.Config数据库连接串
现在很多公司开始为了保证数据库的安全性,通常会对Web.Config的数据库连接字符串进行加密.本文将介绍学习使用Aes加密解密数据库连接字符串.本文采用MySql数据库. AES概念简述 AES 是 ...
- PHP AES的加密解密-----【弃用】
mcrypt_decrypt在PHP7.*已经被弃用,取而代之的是openssl_decrypt/encrypt,请参考: PHP7.* AES的加密解密 AES加密算法 密码学中的高级加密标准(Ad ...
- 【java工具】AES CBC加密
一.定义 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先 ...
- openssl之aes对称加密
AES:密码学中的高级加密标准(Advanced Encryption Standard,AES),又称 Rijndael加密法. 对称加密:用同一个密码 加密/解密 文件. 使用openssl中 ...
- AES--高级数据加密标准
AES--高级数据加密标准 对称密码体制的发展趋势将以分组密码为重点.分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成.密钥扩展算法将b字节用户主密钥扩展成r个子密钥.加密算法由一个密码学上 ...
随机推荐
- phpstudy升级mysql数据库
因为MySQL支持全文索引的只有5.6以上,而我下的phpstudy只有5.5的版本,在导入数据库的时候因为该数据库的表内有使用全文索引,因此必须升级phpstudy的mysql版本,这里就把自己当升 ...
- win10 uwp 截图 获取屏幕显示界面保存图片
本文主要讲如何保存我们的屏幕显示的,保存为图片,也就是截图,截我们应用显示的. UWP有一个功能,可以截图,RenderTargetBitmap 我们首先写一个Grid,我们需要给他名字,我这里给他S ...
- 走进 UITest for Xamarin.Forms
上一篇 走进 Prism for Xamarin.Forms 讲了简单的创建一个项目,然后添加了几个页面来回切换,这篇想先搞下 UITest 官方详细地址:https://developer.xam ...
- 【转】话说C语言const用法
原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...
- switchhost -- 切换host的工具
https://github.com/oldj/SwitchHosts/downloads 下载链接: 1,290 downloads SwitchHosts! _v0.2.2.1790.dmg - ...
- Java中方法的重载和重置(覆盖)的区别
简单来说,重载就是在同一类中允许同时存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可,而重置(覆盖)是子类重新定义父类中己经定义的方法,即子类重写父类方法. 方法的重载 方法的重载就是在同 ...
- js中的引用类型和基本类型
基本类型 : Undifined.Null.Boolean.Number和String 引用类型 :Object .Array .Function .Date等. 基本数据类型保存在栈内存中 是按值访 ...
- 全站HTTPS简单实践
第一个里程碑:创建https证书 [root@web01 backup]# openssl req -new -x509 -nodes -out server.crt -keyout server.k ...
- 桌面消息通知:HTML5 Notification
先上一段完整代码 //注册权限 Notification.requestPermission(function (status) { // 这将使我们能在 Chrome/Safari 中使用 Noti ...
- linq 在查询表达式中处理异常
在查询表达式的上下文中可以调用任何方法. 但是,我们建议避免在查询表达式中调用任何会产生副作用(如修改数据源内容或引发异常)的方法. 此示例演示在查询表达式中调用方法时如何避免引发异常,而不违反有关异 ...