2017-07-27 6 views
0

16バイトの配列キーマテリアルを使用してJavaで倍長の3DESキーを作成し、メッセージで暗号化して16バイト長の配列に戻す必要があります。私は24バイトではなく16バイトで動作するようになっています...Javaでダブルレングス3DESで暗号化して16バイトの配列暗号を生成

DESedeは16バイトの長さの鍵素材で倍長の3DESキーを生成する唯一の方法であるため、24バイト[ DESedeインスタンスを使用して、最後に最初の8バイトを追加して長さを増やして、24バイトを取得します。そう:

byte[] keyMaterial = // Assume this one is 16 bytes. 

    byte[] newKeyBytes = ByteBuffer.wrap(new byte[ 24 ]) 
      .put(Arrays.copyOfRange(keyMaterial, 0, 16)) 
      .put(Arrays.copyOfRange(keyMaterial, 0, 8)) 
      .array(); 

    SecretKeyFactory mySecretKeyFactory = SecretKeyFactory.getInstance("DESede"); 
    KeySpec myKeySpec = new DESedeKeySpec(newKeyBytes); 
    SecretKey encryptionKey = mySecretKeyFactory.generateSecret(myKeySpec); 

私は自分のDESedeキーを持っていますが、私はそれを使って次のようにメッセージを暗号化します。また、私は「ECB」モードを使用する必要があります。

Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey); 
    byte[] returnValue = cipher.doFinal(dataToEncrypt) 

をしかし、結果として、私は戻って24バイト配列ではなく、16バイト配列を取得し、私は24バイト配列を暗号化していますので、これはあると思います。

24バイトではなく16バイトの長さの3DES SecretKeyを作成する方法はありますか?または24バイトのSecretKeyで暗号化する場合は、24バイトではなく16バイトの暗号化されたメッセージを戻しますか?

ありがとうございました!

答えて

1

私はちょうど私の質問への答えを見つけたと思います。

https://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html

IはDESEDE/ECB/NoPaddingを使用し、NoPaddingで使用した場合、その後、24バイトのSecretKeyと16バイトの配列メッセージを暗号化することは、私が必要正確に何である16バイト長暗号メッセージを生成します。

この発見が正しいことを願っています。私が間違っている場合は私を修正してください。

+2

これは正しいです。キーサイズはブロックサイズとほとんど関係がありません。キーサイズの暗号化は結果に反映されません*。 **もっと深くなる**:明らかに、ブロックサイズの倍数であるキーサイズを持つことは、例えば*キー(暗号化)キー自体をラップするときなど、まだ有効です。これはAES-192の欠点の1つです。それはブロックサイズの1.5倍です - それを考慮しないのに十分な理由がよくあります。 –

関連する問題