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, Это упрощает совместимость с обратным словом, например, в аппаратных реализациях.

Другие вопросы по тегам