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