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的工做方式,有兩種:加密或解密。