2017-09-05 8 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モードでは、連続するカウンタ値を暗号化することによって擬似ランダムストリームが作成されます。このストリームはプレーンテキストストリームとXORされ、暗号テキストストリームが生成されます。

実際には、暗号化プロバイダがCTRモードと組み合わせてNoPadding以外のものの指定を受け入れることは少し驚いています。

+0

開発者がエラーをうまく処理しないのは驚きではありません。正しいPKCS7Paddingオプションをサポートするために開発者が怠けている 'PKCS5Padding'オプションを見れば、混乱の原因になります。 – zaph

関連する問題