AES密文與明文長度的關系


參考:
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個字符

明文與密文長度關系

  1. 在原始數據長度為 16 的整數倍時
    假如原始數據長度等於 16n,則使用 NoPadding 時加密后數據長度等於 16n,其它情況下加密數據長度等於 16*(n+1)。
  2. 在不足 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM