博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AES高级加密标准简析
阅读量:6173 次
发布时间:2019-06-21

本文共 6612 字,大约阅读时间需要 22 分钟。

1 AES高级加密标准简介

1.1 概述

  高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在中又称Rijndael加密法,是采用的一种区块加密标准。这个标准用来替代原先的,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由(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旨在取代 的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 key115      * @return116      * @throws Exception117      */118 119     120     @Test121     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://www.cnblogs.com/xq1314/p/7895235.html

你可能感兴趣的文章
Speedy:来自京东的 Docker 镜像存储系统
查看>>
《动手玩转Arduino》——11.2 众多的Arduino板
查看>>
IBM Watson 进入癌症基因组分析市场
查看>>
在 Linux 中查看你的时区
查看>>
Linux集群和自动化维1.6 小结
查看>>
《OpenACC并行编程实战》—— 第1章 并行编程概览 1.1 加速器产品
查看>>
C语言OJ项目参考(2417) 字符串长度
查看>>
ajax的手写、封装和自定义设置
查看>>
class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist
查看>>
android自定义属性
查看>>
ERROR 1114 (HY000): The table 'table1' is full
查看>>
知乎网友神回复:哪怕是平时聊天吹牛的也没见程序员晒,这是为什么呢?
查看>>
Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!...
查看>>
phalapi-进阶篇2(DI依赖注入和单例模式)
查看>>
MySQL 5.7.5 : GTID_EXECUTED系统表
查看>>
Hybrid框架UI重构之路:四、分而治之
查看>>
【原创】Valgrind 基础
查看>>
Es6系列之destructuring assignments
查看>>
CSS ID选择器与CLASS选择器
查看>>
mysql 索引B-Tree类型对索引使用的生效和失效情况详解
查看>>