2017-07-27 70 views
0

我需要在Java中使用16字節數組密鑰材料創建雙倍長度的3DES密鑰,使用它加密消息並獲取16字節長度的數組。我能夠使用24個字節但不是16個字節...使用雙倍長度的3DES密鑰加密Java併產生16字節的數組密碼

因爲DESede需要24字節[],唯一能產生具有16字節長密鑰材料的雙倍長度3DES密鑰的方法,我能通過使用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字節數組加密。

有沒有辦法創建一個16字節長而不是24字節的3DES SecretKey,或者當用24字節長的SecretKey進行加密時,根據需要取回16字節長的加密消息而不是24字節長?

謝謝!

回答

1

我想我剛剛找到了我的問題的答案。

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

我用DESede/ECB/NoPadding並用NoPadding使用時,然後用24個字節加密16個字節陣列消息SecretKey的產生16個字節長的加密消息,其是正是我需要。

我希望這個發現是正確的。如果我錯了,請糾正我。

+2

這是正確的。請記住,密鑰大小與塊大小無關;而加密*密鑰大小並不反映在結果*中。 **進一步深入**:顯然,將密鑰大小設置爲塊大小的倍數仍然有用,例如,當*自己包裝*(加密)密鑰時。這是AES-192的一個缺點;它是塊大小的1.5倍 - 常常不足以考慮它。 –

相關問題