2017-09-05 140 views
0

我對PKCS5 and PKCS7填充的理解是,它們在加密之前將純字節添加到純文本中,因此最後一個塊已滿。密碼文本解密後,將檢查最後一個塊,填充字節標記如何填充哪些字節以及哪些是純文本。Java不添加PKCS5填充

當我用Java中的128位AES和PKCS5加密8個字節(小於一個塊)時,doFinal()的結果只有8個字節。

PKCS7沒有應用,或者我錯過了它的工作原理嗎?

Random secureRandom = new SecureRandom(); 

byte[] ctr = new byte[16]; 
byte[] keyBytes = new byte[16]; 

secureRandom.nextBytes(ctr); 
secureRandom.nextBytes(keyBytes); 

IvParameterSpec ivSpec = new IvParameterSpec(ctr); 
Key key = new SecretKeySpec(keyBytes, "AES"); 

byte[] plainText = new byte[8]; 

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 

byte[] cipherText = cipher.doFinal(plainText); 
System.out.println(cipherText.length); 

回答

2

您正在使用CTR(計數器)模式,這是一種 「流密碼」 模式。您的密文長度與您的純文本長度相同。在CTR模式中,通過加密連續的計數器值來創建僞隨機流。該流與純文本流進行異或運算以產生密文流。

我實際上有點驚訝,加密提供程序接受任何規範,但結合CTR模式NoPadding

+0

開發人員不會很好地處理錯誤,只要看一下'PKCS5Padding'選項,開發人員就懶得支持正確的'PKCS7Padding'選項,從而引起混淆:他們不關心(非importa)! – zaph