參考:
https://www.cnblogs.com/adylee/archive/2007/09/14/893438.html
https://blog.csdn.net/liwei16611/article/details/86312599html
嚴格地說,AES和Rijndael加密法並不徹底同樣(雖然在實際應用中兩者能夠互換),由於Rijndael加密法能夠支持更大範圍的區塊和密鑰長度:AES的區塊長度固定爲128位,密鑰長度則能夠是128,192或256位;而Rijndael使用的密鑰和區塊長度能夠是32位的整數倍,以128位爲下限,256位爲上限。加密過程當中使用的密鑰是由Rijndael密鑰生成方案產生。算法
AES爲分組密碼,分組密碼也就是把明文分紅一組一組的,每組長度相等,每次加密一組數據,直到加密完整個明文。在AES標準規範中,分組長度只能是128位,也就是說,每一個分組爲16個字節(每一個字節8位)。密鑰的長度可使用128位、192位或256位。密鑰的長度不一樣,推薦加密輪數也不一樣,以下表所示:函數
AES | 密鑰長度(32位比特字) | 分組長度(32位比特字) | 加密輪數 |
---|---|---|---|
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
輪數在下面介紹,這裏實現的是AES-128,也就是密鑰的長度爲128位,加密輪數爲10輪。
上面說到,AES的加密公式爲C = E(K,P),在加密函數E中,會執行一個輪函數,而且執行10次這個輪函數,這個輪函數的前9次執行的操做是同樣的,只有第10次有所不一樣。也就是說,一個明文分組會被加密10輪。AES的核心就是實現一輪中的全部操做。編碼
因爲採用了256位AES加密,使用了CBC模式加PKCS #5補齊,因此AES的密文字節長度 = (明文長度 +1) / 16 * 16(即比明文長度大的最小的16的倍數)。
JNCryptor返回的密文長度則是在此基礎上再加上66個字節。加密
返回的密文是二進制數據,沒法直接顯示。若是須要進一步編碼爲可顯示字符串,則需進行BASE64編碼或者十六進制編碼。編碼後的數據長度會進一步增長(BASE64是增加爲4/3倍起的最小的4的倍數,十六進制編碼是增加爲2倍)。好比,對原文長度在32-47個字節之間的明文,通過AES256JNCryptor加密後的密文長度就是114個字節,再作一次BASE64編碼轉換成可顯示字符就成了152個字符.net
例如:算法/模式/填充(AES/CBC/PKCS5Padding),明文69字符,則密文爲69=164+5,其中n爲4,m爲5,密文長度爲16(4+1)=80字節,而若是你再轉爲base64以後,長度也會變長。code
Base64編碼要求把3個8位字節(38=24)轉化爲4個6位的字節(46=24),以後在6位的前面補兩個0,造成8位一個字節的形式。
若是剩下的字符不足3個字節,則用0填充,輸出字符使用'=',所以編碼後輸出的文本末尾可能會出現1或2個'='。
爲了保證所輸出的編碼位可讀字符,Base64制定了一個編碼表,以便進行統一轉換。編碼表的大小爲2^6=64,這也是Base64名稱的由來。它長度爲=bytestring * (4 / 3)
,不能被3整除的,加到最小被3整除的數 ,如80你須要加到81,結果81*(4/3)=108htm
實例:
V61234567820200612D102103f,V51234567820200612D102103f
6B6N1qoTEmyJKxQOO6xdwXu2xP+bbnjsAadbDpGuOf5CAwtW8qVNseD4cWlAdX47KwTNNmm1NpMsYCSGuqYuGg==
明文長:53
密文base64:88
計算:53=163+5,16(3+1)=64,64(4/3),補兩個0(=)66/34=88blog