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年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代码实现

  1 package xin.dreaming.aes;
  2
  3
  4 import javax.crypto.Cipher;
  5 import javax.crypto.SecretKey;
  6 import javax.crypto.spec.IvParameterSpec;
  7 import javax.crypto.spec.SecretKeySpec;
  8
  9 import org.apache.commons.codec.binary.Base64;
 10 import org.junit.Test;
 11 public class AESUtils {
 12
 13     /**
 14      * 生成随机密钥
 15      *
 16      * @param size
 17      *            位数
 18      * @return
 19      */
 20     public static String generateRandomKey(int size) {
 21         StringBuilder key = new StringBuilder();
 22         String chars = "0123456789ABCDEF";
 23         for (int i = 0; i < size; i++) {
 24             int index = (int) (Math.random() * (chars.length() - 1));
 25             key.append(chars.charAt(index));
 26         }
 27         return key.toString();
 28     }
 29
 30     /**
 31      * AES加密
 32      *
 33      * @param plainBytes
 34      *            明文字节数组
 35      * @param keyBytes
 36      *            对称密钥字节数组
 37      * @param useBase64Code
 38      *            是否使用Base64编码
 39      * @param charset
 40      *            编码格式
 41      * @return byte[]
 42      */
 43     public static byte[] encryptAES(byte[] plainBytes, byte[] keyBytes, boolean useBase64Code, String charset) throws Exception {
 44         String cipherAlgorithm = "AES/CBC/PKCS5Padding";
 45         String keyAlgorithm = "AES";
 46         String IV = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
 47
 48         try {
 49             Cipher cipher = Cipher.getInstance(cipherAlgorithm);
 50             SecretKey secretKey = new SecretKeySpec(keyBytes, keyAlgorithm);
 51             IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes());
 52
 53             cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
 54
 55             byte[] encryptedBlock = cipher.doFinal(plainBytes);
 56
 57             if (useBase64Code) {
 58                 return Base64.encodeBase64String(encryptedBlock).getBytes(charset);
 59             } else {
 60                 return encryptedBlock;
 61             }
 62         } catch (Exception e) {
 63             e.printStackTrace();
 64             throw new Exception("AES加密失败");
 65         }
 66     }
 67
 68     /**
 69      * AES解密
 70      *
 71      * @param cryptedBytes
 72      *            密文字节数组
 73      * @param keyBytes
 74      *            对称密钥字节数组
 75      * @param useBase64Code
 76      *            是否使用Base64编码
 77      * @param charset
 78      *            编码格式
 79      * @return byte[]
 80      */
 81     public static byte[] decryptAES(byte[] cryptedBytes, byte[] keyBytes, boolean useBase64Code, String charset) throws Exception {
 82         String cipherAlgorithm = "AES/CBC/PKCS5Padding";
 83         String keyAlgorithm = "AES";
 84         String IV = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
 85
 86         byte[] data = null;
 87
 88         // 如果是Base64编码的话,则要Base64解码
 89         if (useBase64Code) {
 90             data = Base64.decodeBase64(new String(cryptedBytes, charset));
 91         } else {
 92             data = cryptedBytes;
 93         }
 94
 95         try {
 96             Cipher cipher = Cipher.getInstance(cipherAlgorithm);
 97             SecretKey secretKey = new SecretKeySpec(keyBytes, keyAlgorithm);
 98             IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes());
 99
100             cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
101
102             byte[] decryptedBlock = cipher.doFinal(data);
103
104             return decryptedBlock;
105         } catch (Exception e) {
106             e.printStackTrace();
107             throw new Exception("AES解密失败");
108         }
109     }
110
111     /**
112      * BASE64加密
113      *
114      * @param key
115      * @return
116      * @throws Exception
117      */
118
119
120     @Test
121     public void aesTest() throws Exception{
122         String value ="DREAMING.XIN";
123         //生成随机AES对称密钥
124         String keyStr = generateRandomKey(16);
125         byte[] keyBytes = keyStr.getBytes("UTF-8");
126
127         byte[] encryptAES = encryptAES(value.getBytes(), keyBytes, true, "UTF-8");
128
129         System.out.println("AES加密后数据: "+new String(encryptAES));
130
131         /*String encodeBase64String = Base64.encodeBase64String(encryptAES);
132
133         System.out.println("先AES后BASE64: "+encodeBase64String);
134
135         byte[] decodeBase64 = Base64.decodeBase64(encodeBase64String);*/
136
137         byte[] decryptAES = decryptAES(encryptAES, keyBytes, true, "UTF-8");
138
139         System.out.println("AES减密后数据: "+ new String(decryptAES));
140
141     }
142
143 }

运行结果:

参考:

  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

时间: 2024-10-07 08:42:21

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

高级加密标准AES的工作模式(ECB、CBC、CFB、OFB)

高级加密标准(Advanced Encryption Standard: AES)是美国国家标准与技术研究院(NIST)在2001年建立了电子数据的加密规范.它是一种分组加密标准,每个加密块大小为128位,允许的密钥长度为128.192和256位. ECB模式(电子密码本模式:Electronic codebook) ECB是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理. CBC模式(密码分组链接:Cipher-bloc

第六章 高级加密标准

第六章 高级加密标准 美国国家技术研究所NIST在2001年发布了高级加密标准AES,一个对称分组密码算法,取代DES称为广泛使用的标准. 与公钥密码RSA相比,AES以及大多数的对称密码的结构都很复杂. AES中所有的运算是在8位的字节上进行的. 一个域是一个结合,在集合内进行加减乘除运算的结果,也不会离开该域.例如\(Z_p=\{0,1,2,3,\dots,p-1\}\),其中\(p\)是一个素数,然后该域上的操作是取模. 1. AES的结构 明文分组长度为128位即16字节(对明文进行分组

AES(高级加密)

AES(高级加密) #3.6安装 pip3 install pycryptodome #mac pip3 install pycrypto a. 事例: ############################### 加密 ############################## from Crypto.Cipher import AES def encrypt(message): key = b'dfdsdfsasdfdsdfs' #key必须是16的整数倍 cipher = AES.ne

小编带你简单了解一下加密技术原理:AES加密标准

随着因特网的发展,信息传输及存储的安全问题成为影响因特网应用发展的重要因素.信息安全技术也就成为了人们研究因特网应用的新热点. 信息安全的研究包括密码理论与技术.安全协议与技术.安全体系结构理论.信息对抗理论与技术.网络安全与安全产品等领域,其中密码算法的理论与实现研究是信息安全研究的基础. AES加密标准1977年1月公布的数据加密标准DES(Data Encrption Standard)经过20年的实践应用后,现在已被认为是不可靠的.1997年1月美国国家标准和技术研究所(NIST)发布了

DES/AES/MD5加密方法

大家好: 今天有空研究了下大家都在喊的AES加密!还以为是什么深奥的东西呢!终于了解了,心中释然了!跟大家一起分享下吧!DES其实就是:数据加密标准 英文的缩写!就是个加密的标注而已,AES就是 高级加密标准 英文的缩写咯,大家都叫缩写叫惯了,搞得我们这些没接触的人一头雾水!心里还真憋屈的慌呢! 这是在搜集资料的时候拿了个例子练手,不过有个问题就是,把这代码放到文本里用CMD运行的时候出现了乱码情况!所幸的是注释,不影响效果!但是,程序要真遇到这样的情况的话,就得转码了,因为文本的编码是GBK的

AES--高级数据加密标准

对称密码体制的发展趋势将以分组密码为重点.分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成.密钥扩展算法将b字节用户主密钥扩展成r个子密钥.加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成.混乱和密钥扩散是分组密码算法设计的基本原则.抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点. AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准. AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128.192.256,分组长度128位,

web应用构架LAMT及tomcat负载简析

Httpd    (mod_jk.so) workers.properties文件 uriworkermap.properties文件 <--AJP1.3--> Tomcat  --> jdk 大致流程:apache服务器通过mod_jk.so 模块处理jsp文件的动态请求.通过tomcat worker等待执行servlet/JSP的tomcat实例.使用 AJP1.3协议与tomcat通信.tomcat有借助jdk解析. 负载就是 多台tomcat.共同解析apache发送的jsp请

Java Annotation 及几个常用开源项目注解原理简析

PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示例 Override Annotation Java 1 2 3 @Override public void onCreate(Bundle savedInstanceState); Retrofit Annotation Java 1 2 3 @GET("/users/{username}&quo

Linux网络性能优化方法简析

Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux内核中提升网络性能的一些优化方法的简析,以让我们去后台看看魔术师表演用的盒子,同时也看看内核极客们是怎样灵活的,渐进的去解决这些实际的问题. AD:2014WOT全球软件技术峰会北京站 课程视频发布 对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性