1 AES高级加密标准简介

1.1 概述

  高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

1.2 发展历史

  1997年4月15日,美国ANSI发起征集AES(advanced encryption standard)的活动,并为此成立了AES工作小组。
  1997年9月12日,美国联邦登记处公布了正式征集AES候选算法的通告。对AES的基本要求是: 比三重DES快、至少与三重DES一样安全、数据分组长度为128比特、密钥长度为128/192/256比特。
  1998年8月12日,在首届AES候选会议(first AES candidate conference)上公布了AES的15个候选算法,任由全世界各机构和个人攻击和评论。
  1999年3月,在第2届AES候选会议(second AES candidate conference)上经过对全球各密码机构和个人对候选算法分析结果的讨论,从15个候选算法中选出了5个。分别是RC6、Rijndael、SERPENT、Twofish和MARS。
  2000年4月13日至14日,召开了第3届AES候选会议(third AES candidate conference),继续对最后5个候选算法进行讨论。
  2000年10月2日,NIST宣布Rijndael作为新的AES。经过3年多的讨论,Rijndael终于脱颖而出。
  Rijndael由比利时的Joan Daemen和Vincent Rijmen设计。算法的原型是Square算法,它的设计策略是宽轨迹策略(wide trail strategy)。算法有很好的抵抗差分密码分析及线性密码分析的能力。

1.3 算法原理

  对称密码体制的发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点。
  AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。
  AES的基本要求是,采用对称分组密码体制,密钥的长度最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。1999年3月完成了第二轮AES2的分析、测试。2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为 AES.
  在应用方面,尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES迟早要被AES代替。流密码体制较之分组密码在理论上成熟且安全,但未被列入下一代加密标准。
  AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。AES加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。

1.4 算法应用

  高级加密标准AES(Rijndael)算法在各行业各部门中将获得广泛的应用,成为虚拟专用网、SONET(同步光网络)、远程访问服务器(RAS)、高速ATM/Ethernet路由器、移动通信、卫星通信、电子金融业务等的机密算法,并逐渐取代DES在IPSee、SSL和ATM中的使用。IEEE802.11i草案已经定义了AES加密的两种不同运行模式,成功解决了无线局域网(WLAN)标准中的诸多安全问题。此外,得益于密码技术的高速发展,政府及军事通信更多的采用高级的加密算法,以及网络保密系统,财政保密、游戏机密等方面AES加密算法都得到了广泛的应用。

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)); } }

运行结果:

参考:

  1、https://baike.baidu.com/item/aes/5903?fr=aladdin&fromid=3233272&fromtitle=aes%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95

AES高级加密标准简析的更多相关文章

  1. 高级加密标准(英语:Advanced Encryption Standard,缩写:AES)

    2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.

  2. AES(高级加密)

    AES(高级加密) #3.6安装 pip3 install pycryptodome #mac pip3 install pycrypto a. 事例: ####################### ...

  3. Aes加密算法加密模式介绍

    本文转自:https://www.jianshu.com/p/582d3a47729a AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中 ...

  4. PHP AES的加密解密

    AES加密算法 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...

  5. 使用Aes对称加密解密Web.Config数据库连接串

    现在很多公司开始为了保证数据库的安全性,通常会对Web.Config的数据库连接字符串进行加密.本文将介绍学习使用Aes加密解密数据库连接字符串.本文采用MySql数据库. AES概念简述 AES 是 ...

  6. PHP AES的加密解密-----【弃用】

    mcrypt_decrypt在PHP7.*已经被弃用,取而代之的是openssl_decrypt/encrypt,请参考: PHP7.* AES的加密解密 AES加密算法 密码学中的高级加密标准(Ad ...

  7. 【java工具】AES CBC加密

    一.定义 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先 ...

  8. openssl之aes对称加密

    AES:密码学中的高级加密标准(Advanced Encryption Standard,AES),又称 Rijndael加密法. 对称加密:用同一个密码  加密/解密  文件. 使用openssl中 ...

  9. AES--高级数据加密标准

    AES--高级数据加密标准 对称密码体制的发展趋势将以分组密码为重点.分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成.密钥扩展算法将b字节用户主密钥扩展成r个子密钥.加密算法由一个密码学上 ...

随机推荐

  1. PhoneWindow,ViewRoot,Activity之间的大致关系

    http://www.nowamagic.net/academy/detail/50160216 在android里,我们都知道activity.但是一个activity跟一个Window是一个什么关 ...

  2. Logcat monkey命令

    1. monkey命令 adb shell monkey -p com.autonavi.gxdtaojin --bugreport --ignore-crashes --ignore-timeout ...

  3. javascript面向对象的写法及jQuery面向对象的写法

    文章由来:jQuery源码学习时的总结 在JS中,一般的面向对象的写法如下: function Cao(){}//定义一个构造函数 Cao.prototype.init = function(){}/ ...

  4. 转:C++学习之Pair

    Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型,第一个元素是int型的 ...

  5. 谈谈我对php通信的理解及人生小感

    故事背景: 小王和小甜是亲密无间的好朋友. 小王到自己QQ群里看到一个免单活动, 自己支付宝余额不足, 遂用小甜的手机淘宝先花150元购买了活动产品. 到货后商家告诉小王, 确认收货后提供旺旺账号.支 ...

  6. Linux入门(17)——Ubuntu16.04显示内存CPU网速等(System Monitor)

    终端查看内存状况有两个命令 top htop 如果系统没有安装htop的话,那就安装一下. 然而这样比较麻烦,System Monitor是个不错的选择,System Monitor可以显示网速,内存 ...

  7. flask + wtform + google storage

    项目需要使用 flask 上传.下载文件到 google storage 上, 搜了一圈没有能直接结合 wtform 使用的插件,所以动手造了个轮子. 只实现了基本的上传,下载的功能,后续可能会完善预 ...

  8. Yii2之mailer的使用

     Mailer组件是yii框架自带的用于收发邮件的组件,无需安装,只需做一些配置即可使用,非常便捷.本文就mailer组件从配置到使用进行简单讲解.  首先在config/main.php配置如下: ...

  9. LeetCode Questions List (LeetCode 问题列表)- Java Solutions

    因为在开始写这个博客之前,已经刷了100题了,所以现在还是有很多题目没有加进来,为了方便查找哪些没加进来,先列一个表可以比较清楚的查看,也方便给大家查找.如果有哪些题目的链接有错误,请大家留言和谅解, ...

  10. Python 由__dict__和dir()引发的一些思考

    关于__dict__和dir()的区别和作用请参考这篇文章:http://blog.csdn.net/lis_12/article/details/53521554 说下我当时遇到的问题: class ...