Ошибка дешифрования 3DES Недопустимая длина ключа

Я использую 3DESC для расшифровки данных, но получаю следующее исключение

java.security.InvalidKeyException: Invalid key length: 16 bytes

Мой код:

public static byte[] decrypt3DESCBC(byte[] keyBytes, byte[] ivBytes,
        byte[] dataBytes) {
    try {
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
        SecretKeySpec newKey = new SecretKeySpec(keyBytes, "DESede");
        Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec); // Causes Exception
        return cipher.doFinal(dataBytes);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

Напечатал весь использованный выше массив байтов

keyBytes : FC15780BB4B0**********0876482C1B // Masked 10 Characters
ivBytes : 0000000000000000
dataBytes : AF53C90F7FAD977E**********69DB5A2BF3080F9F07F4BFEA3EDB4DE96887BE7D40A5A590C0911A // Masked 10 Characters

person Shaggy    schedule 30.12.2013    source источник


Ответы (2)


Шифр DES-EDE можно использовать с 3 различными подразделами, поэтому размер ключа должен составлять 24 байта (3 раза по 8 байт). Если вы хотите использовать только 2 ключа (т.е. в этом режиме первый ключ == последний ключ), вам просто нужно продублировать первые 8 байт массива ключей.

byte[] key;
if (keyBytes.length == 16) {
    key = new byte[24];
    System.arraycopy(keyBytes, 0, key, 0, 16);
    System.arraycopy(keyBytes, 0, key, 16, 8);
} else {
    key = keyBytes;
}
person Jcs    schedule 30.12.2013
comment
Должна ли третья строка быть key = new byte[24];? - person Drew Wills; 17.12.2016

Вы используете более старую версию Java, которая не поддерживает длину ключа 128 бит. В принципе, 3DES всегда использует три ключа — ключи ABC — каждый из которых имеет длину 64 бита, когда мы включаем биты четности в подсчет (для одного DES шифруется с помощью A, затем расшифровывается с помощью B, затем снова шифруется с помощью C). Однако 128-битный (двойной) ключ использует A = C. Таким образом, чтобы создать действительный 24-байтовый ключ, вам нужно скопировать и объединить первые 8 байтов в конец массива. Или вы можете перейти на более новую версию JRE или использовать поставщика, который принимает 16-байтовые ключи 3DES.

Обратите внимание, что 192-битные (168-битные эффективные) ключи 3DES немного более безопасны, чем 128-битные (112-битные эффективные) ключи; 128-битный 3DES больше не принимается NIST (который занимается стандартизацией криптографии правительством США). Вы должны попытаться переключиться на AES, если это возможно; У AES нет таких махинаций, и он гораздо более безопасен.

person Maarten Bodewes    schedule 30.12.2013