AES算法简介html
AES是一种对称加密算法,或称分组对称加密算法。 是Advanced Encryption Standard高级加密标准,简称AESjava
AES的基本要求是,采用对称分组密码体制。分组密码算法一般由密钥扩展算法和加密(解密)算法两部分组成算法
AES加密数据块分组长度必须为128比特(bit位),密钥长度能够是128比特、192比特、256比特中的任意一个(若是数据块及密钥长度不足时,会补齐)。安全
128位数据块,16byte字节的数据为一组,192位,24字节数据为一组。256位,32字节数据为一组ide
AES加密有不少轮的重复和变换。大体步骤以下(大概知道步骤就好吧,不想太深刻研究):post
一、密钥扩展(KeyExpansion),二、初始轮(Initial Round),三、重复轮(Rounds),ui
每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,四、最终轮(Final Round),最终轮没有MixColumns。加密
AES加密算法有多种加密模式:url
1.电码本模式(Electronic Codebook Book (ECB));2.密码分组连接模式(Cipher Block Chaining (CBC));spa
3.计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output FeedBack (OFB))。
ECB:将明文分红若干段相同的小段,而后对每一小段进行加密。
CBC:这种模式是先将明文切分红若干小段,而后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
参考连接:AES加密的四种模式详解
AES加密明文数据的5种填充模式
这些都属于字节填充
PKCS7Padding(PKCS#7),PKCS5Padding(PKCS#5),Zero padding,ISO 10126 , ANSI X.923
例如,如今数据128位数据块方式进行加密,即16字节数据,,,如今有字符串String encryptedStr = "012345678912"
note:因为utf-8下汉字字节长度是可变的,因此直接使用英文或数字字符串举例。
上面数据的字符串长度为12字节,还须要补充4字节数据。
ANSIX923是最后一个字节数据为所缺字节的数进行填充,其他填0。上面须要补充4字节数据,因此最后一字节填4,其他3字节都填0
ISO10126则是最后一字节填4,剩余的都填0,
PKCS#7 是在填充字节上都填相同的数据,上面数据缺乏4字节,因此全部字节上都填4
若是缺乏10字节,则在补充的10字节数据上都填a
ANSI X.923:... | DD DD DD DD DD DD DD DD | DD DD DD DD (00 00 00 04)|【除了最后字节,其余填0】
ISO 10126:.... | DD DD DD DD DD DD DD DD | DD DD DD DD (81 A6 23 04)|【除了最后字节,其余随机】
PKCS7(Rfc3852) | DD DD DD DD DD DD DD DD | DD DD DD DD (04 04 04 04)
模式说明:(不完整) 算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度 AES/CBC/NoPadding 16 不支持 AES/CBC/PKCS5Padding 32 16 AES/CBC/ISO10126Padding 32 16 AES/CFB/NoPadding 16 原始数据长度 AES/CFB/PKCS5Padding 32 16 AES/CFB/ISO10126Padding 32 16 AES/ECB/NoPadding 16 不支持 AES/ECB/PKCS5Padding 32 16 AES/ECB/ISO10126Padding 32 16 AES/OFB/NoPadding 16 原始数据长度 AES/OFB/PKCS5Padding 32 16 AES/OFB/ISO10126Padding 32 16 AES/PCBC/NoPadding 16 不支持 AES/PCBC/PKCS5Padding 32 16 AES/PCBC/ISO10126Padding 32 16
AES-128-CBC加密解密算法
这个是使用AES加密算法的CBC模式,使用128位数据块为一组进行加密解密,
即16字节明文,对应16字节密文,,明文加密时,若是数据不够16字节,则会将数据补全剩余字节
加密时须要的参数
一、传入要加密的明文
二、传入一个16字节的key
三、传入一个16字节的初始偏移向量IV
用初始向量和密钥加密第一组数据,而后把第一组数据加密后的密文从新赋值给IV,而后进行第二组加密,循环进行直到结束
解密时须要参数
一、带解密的密文
二、加密解密的key一致
三、跟加密时传递IV参数一致
AES加密解密类
须要额外的jar包bcprov-jdk16-1.46-sources.jar
可添加依赖
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.46</version> </dependency>
AES.java
import java.security.AlgorithmParameters; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchProviderException; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class AES { //加密方式 public static String KEY_ALGORITHM = "AES"; //数据填充方式 String algorithmStr = "AES/CBC/PKCS7Padding"; //避免重复new生成多个BouncyCastleProvider对象,由于GC回收不了,会形成内存溢出 //只在第一次调用decrypt()方法时才new 对象 public static boolean initialized = false; /** * * @param originalContent * @param encryptKey * @param ivByte * @return */ public byte[] encrypt(byte[] originalContent, byte[] encryptKey, byte[] ivByte) { initialize(); try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec skeySpec = new SecretKeySpec(encryptKey, "AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(ivByte)); byte[] encrypted = cipher.doFinal(originalContent); return encrypted; } catch (Exception e) { throw new RuntimeException(e); } } /** * AES解密 * 填充模式AES/CBC/PKCS7Padding * 解密模式128 * @param content * 目标密文 * @return * @throws Exception * @throws InvalidKeyException * @throws NoSuchProviderException */ public byte[] decrypt(byte[] content, byte[] aesKey, byte[] ivByte) { initialize(); try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); Key sKeySpec = new SecretKeySpec(aesKey, "AES"); cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化 byte[] result = cipher.doFinal(content); return result; } catch (Exception e) { throw new RuntimeException(e); } } /**BouncyCastle做为安全提供,防止咱们加密解密时候由于jdk内置的不支持改模式运行报错。**/ public static void initialize() { if (initialized) return; Security.addProvider(new BouncyCastleProvider()); initialized = true; } // 生成iv public static AlgorithmParameters generateIV(byte[] iv) throws Exception { AlgorithmParameters params = AlgorithmParameters.getInstance("AES"); params.init(new IvParameterSpec(iv)); return params; } }
另外一种加密算法DES
DES算法的入口参数有三个:Key、Data、Mode。
其中Key为7个字节共56位,是DES算法的工做密钥;
Data为8个字节64位,是要被加密或被解密的数据;
Mode为DES的工做方式,有两种:加密或解密。