DESedeKeySpec Неправильный размер ключа
Мне нужно использовать ключ 3DES двойной длины для шифрования случайных 8 байтов, а затем использовать зашифрованное значение для получения нового ключа 3DES.
Когда я пытаюсь создать экземпляр DESedeKeySpec с encryptedRandomValue, я получаю сообщение об ошибке "Неверный размер ключа". Можете ли вы посоветовать мне, как решить эту проблему?
DESedeKeySpec myKeySpec = new DESedeKeySpec (encryptedRandomValue);
Я могу избежать этой ошибки, если все мои SecretKeys являются одним ключом DES. Но мне нужно использовать двойной ключ 3DES и режим ECB.
Вот мой код;
// Generate double length 3DES Master Key
KeyGenerator masterEncKeyGenerator = KeyGenerator.getInstance("DESede");
masterEncKeyGenerator.init(112);
SecretKey masterKey = masterEncKeyGenerator.generateKey();
//Prepare random bytes
byte[] randomKeyValue = "rn4yrbdy".getBytes();
// Encrypt random bytes with the 3DES Master key
final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, masterKey);
byte[] encryptedRandomValue = cipher.doFinal(randomKeyValue);
// Derive new key 3DES Key
SecretKeyFactory mySecretKeyFactory = SecretKeyFactory.getInstance("DESede");
DESedeKeySpec myKeySpec = new DESedeKeySpec(encryptedRandomValue);
SecretKey derivedKey = mySecretKeyFactory.generateSecret(myKeySpec);
Я понимаю, почему я получаю эту ошибку. Это потому, что DESedeKeySpec должен принимать в качестве материала ключа 24 байта, а я даю его только 8. Но у меня есть требование: создать ключ 3DES из зашифрованного, с основным ключом 3DES, случайные 8-байтовые данные...
1 ответ
Triple DES - это всего лишь 3 последовательных одиночных операции DES, выполняемых с разными ключами. В частности, это шифрование DES, за которым следует дешифрование DES, за которым следует шифрование DES.
DES e ncrypt-d ecrypt-e ncrypt - это то, что дает ему имя DESede
Разница между клавишами двойной длины и тройной длины заключается в том, какую часть ключа вы используете в каждой из трех операций DES.
Ключ двойной длины: k1 || k2
даст следующие операции DES:
Encrypt(k1) - Decrypt(k2) - Encrypt(k1)
Ключ тройной длины: k1 || k2 || k3
даст следующие операции DES:
Encrypt(k1) - Decrypt(k2) - Encrypt(k3)
Стандартная реализация в Java не поддерживает тройные ключи DES двойной длины напрямую, но вы можете получить тот же эффект, повторяя первую часть ключа как третью часть: k1 || k2 || k1
Любопытно, что вы можете поддерживать одно шифрование DES с помощью тройного DES, повторяя один ключ DES три раза, например: k1 || k1 || k1
, Это упрощает совместимость с обратным словом, например, в аппаратных реализациях.