w88优德官网电脑版AES高端加密规范简析

发布时间:2019-04-22  栏目:w88优德官网电脑版  评论:0 Comments

一.三 算法原理

  对称密码体制的发展趋势将以分组密码为主要。分组密码算法日常由密钥扩大算法和加密(解密)算法两有的构成。密钥增加算法将b字节用户主密钥扩大成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的宗旨标准。抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的规划要点。

  AES是美利坚协作国国标才具商量所NIST目的在于代表DES的二一世纪的加密规范。

  AES的着力供给是,采取对称分组密码体制,密钥的长短最少帮衬为12八、1玖二、256,分老总度1二十九个人,算法应易于种种硬件和软件达成。一九玖6年NIST发轫AES第一轮分析、测试和征集,共发出了壹多少个候选算法。一九九玖年二月完毕了第叁轮AES贰的分析、测试。两千年5月二十三日U.S.A.政党正规发布当选比利时密码学家Joan
Daemen 和 文斯nt Rijmen 提议的一种密码算法BMWX五IJNDAEL 作为 AES.

  在行使方面,即便DES在安全上是脆弱的,但鉴于飞快DES芯片的汪洋生产,使得DES还可以临时继续采取,为进步安全强度,常常使用独立密钥的三级DES。不过DES迟早要被AES代替。流密码体制较之分组密码在斟酌上成熟且安全,但未被列入下一代加密标准。

  AES加密数据块分老董度必须为12八比特,密钥长度能够是128比特、1玖二比特、25六比特中的任性二个(倘使数据块及密钥长度相差时,会补齐)。AES加密有好些个轮的重复和改换。大概步骤如下:一、密钥扩充(KeyExpansion),二、开端轮(Initial
Round),三、重复轮(Rounds),每1轮又包含:SubBytes、ShiftRows、MixColumns、AddRoundKey,四、最终轮(Final
Round),最后轮未有MixColumns。

参考:

  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

1.1 概述

  高档加密标准(俄语:Advanced Encryption
Standard,缩写:AES),在密码学中又称Rijndael加密法,是U.S.A.际结盟邦政党利用的1种区块加密规范。这几个标准用来代表原先的DES,已经被多方分析且广为整个世界所采用。经过5年的挑三拣肆流程,高端加密规范由美利坚合众国国标与才干研商院(NIST)于2001年三月十三日颁发于FIPS
PUB
1九七,并在2002年七月二十五日改成实用的正统。200陆年,高端加密规范已然成为对称密钥加密中最盛行的算法之一。

二 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 }

运营结果:

w88优德官网电脑版 1

一.4 算法应用

  高等加密标准AES(Rijndael)算法在各行业各机构上将拿到分布的利用,成为虚拟专用网、SONET(同步光网络)、远程访问服务器(RAS)、高速ATM/Ethernet路由器、移动通讯、卫星通信、电子金融业务等的地下算法,并稳步替代DES在IPSee、SSL和ATM中的使用。IEEE80贰.11i草案已经定义了AES加密的二种分歧运营方式,成功消除了有线局域网(WLAN)标准中的多数平安难题。其它,得益于密码技巧的立时发展,政党及军队通讯越来越多的使用高端的加密算法,以及网络保密种类,财政保密、游戏机密等地方AES加密算法都得到了周围的运用。

一 AES高级加密标准简单介绍

一.二 发展历史

  19玖柒年三月1贰二十二日,United StatesANSI发起征集AES(advanced encryption
standard)的移动,并为此建立了AES职业小组。
  1997年八月5日,U.S.际联盟邦登记处揭橥了正规征集AES候选算法的通告。对AES的主题须求是:
比三重DES快、至少与三重DES同样安全、数据分经理度为12八比特、密钥长度为128/192/256比特。

  一9九七年十月31日,在第贰届AES候选会议(first AES candidate
conference)上公布了AES的一三个候选算法,任由环球各部门和个人攻击和评论。

  一九9捌年十二月,在第三届AES候选会议(second AES candidate
conference)上通过对全球各密码机构和民用对候选算法分析结果的座谈,从1多个候选算法中选出了多少个。分别是HighlanderC陆、Rijndael、SERPENT、Twofish和MAHummerH二S。

  2000年二月130日至7日,举行了第贰届AES候选会议(third AES candidate
conference),继续对最终5个候选算法举行座谈。

  两千年五月三日,NIST发布Rijndael作为新的AES。经过三年多的斟酌,Rijndael终于横空出世。

  Rijndael由Billy时的Joan Daemen和文斯nt
Rijmen设计。算法的原型是Square算法,它的宏图计策是宽轨迹战略(wide trail
strategy)。算法有很好的抵御差分密码分析及线性密码分析的才能。

留下评论