參考:
https://www.cnblogs.com/adylee/archive/2007/09/14/893438.html
https://blog.csdn.net/liwei16611/article/details/86312599
AES介紹
嚴格地說,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個字符
明文與密文長度關系
- 在原始資料長度為 16 的整數倍時
假如原始資料長度等于 16n,則使用 NoPadding 時加密后資料長度等于 16n,其它情況下加密資料長度等于 16*(n+1), - 在不足 16 的整數倍的情況下
假如原始資料長度等于 16n+m [其中 m 小于16],除了 NoPadding 填充之外的任何方式,加密資料長度都等于 16(n+1);
例如:演算法/模式/填充(AES/CBC/PKCS5Padding),明文69字符,則密文為69=164+5,其中n為4,m為5,密文長度為16(4+1)=80位元組,而如果你再轉為base64之后,長度也會變長,
base64長度
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)=108
實體:
V61234567820200612D102103f,V51234567820200612D102103f
6B6N1qoTEmyJKxQOO6xdwXu2xP+bbnjsAadbDpGuOf5CAwtW8qVNseD4cWlAdX47KwTNNmm1NpMsYCSGuqYuGg==
明文長:53
密文base64:88
計算:53=163+5,16(3+1)=64,64(4/3),補兩個0(=)66/34=88
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/242737.html
標籤:其他
