DESedeKeySpec Неверный размер ключа

Мне нужно использовать ключ 3DES двойной длины для шифрования случайных 8 байтов, а затем использовать зашифрованное значение для получения нового ключа 3DES.

Когда я пытаюсь создать экземпляр DESedeKeySpec с зашифрованным RandomValue, я получаю сообщение об ошибке «Неверный размер ключа». Можете ли вы посоветовать мне, как решить эту проблему?

DESedeKeySpec myKeySpec = новый 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 байтов данных...


person Simplyi    schedule 08.03.2017    source источник


Ответы (1)


Тройной DES — это всего лишь 3 последовательных одиночных операции DES, выполняемых с разными ключами. В частности, это шифрование DES, за которым следует дешифрование DES, за которым следует шифрование DES.

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

person Ebbe M. Pedersen    schedule 09.03.2017
comment
Эбби, большое спасибо за ответ. Из вашего ответа я понимаю, что я неправильно создаю ключ двойной длины... Итак, чтобы получить правильный ключ двойной длины, мне нужно создать ключ с помощью KeyGenerator.getInstance(DESede); а затем взять первые 8 байтов и объединить в новый байт [] вместе со вторыми 8 байтами, а затем снова с первыми 8 байтами и сгенерировать из него новый DESede SecretKey? - person Simplyi; 09.03.2017
comment
Да, это создаст ключ 3DES, эквивалентный ключу двойной длины в первых 16 байтах. - person Ebbe M. Pedersen; 09.03.2017
comment
спасибо за ваш покой. Что, если я создам не один ключ DESede, а два отдельных ключа DES: ключ и ключ 2, а затем объединим эти два ключа в массив байтов и попытаюсь сгенерировать из этих байтов новый ключ DESede. Будет ли это все еще делать действительный ключ 3DES двойной длины?.... и после шифрования с помощью этого ключа 3DES случайный 8-байтовый массив, не выдаст ли он мне ошибку, если я попытаюсь получить новый ключ 3DES, как в примере, который у меня есть опубликовано выше?... DESedeKeySpec может занимать только 24 байта, но вывод 3DES-чиппера составляет только 8 байтов... и это дает мне ошибку... - person Simplyi; 09.03.2017