Java - Преобразование строки в ключ DES - PullRequest
3 голосов
/ 11 августа 2011

Мне дали ключ в виде строки и зашифрованный файл с использованием DES. Это все, что я знаю. Я не знаю, как был закодирован ключ.

Существует также файл des.exe, который я могу использовать для расшифровки, это все, что я нашел в Интернете: http://knowledge -republic.com / CRM / 2011/07 / как расшифровать-извлечь -recreate-Thecus-хранения-прошивки /

Используя des.exe, единственная команда, с которой он работает, это "-D", а не "-d".

Моя цель - использовать Java для того же. Я скопировал и вставил это откуда-то

    String key = "blah";
    DESKeySpec dks = new DESKeySpec(key.getBytes());
    SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
    SecretKey desKey = skf.generateSecret(dks);
    System.out.println(desKey);

    Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE

    if (mode == Cipher.DECRYPT_MODE) {
        cipher.init(Cipher.DECRYPT_MODE, desKey);
        CipherOutputStream cos = new CipherOutputStream(os, cipher);
        doCopy(is, cos);
    }

и это не работает.

Какие еще есть варианты при преобразовании строки в ключ?

Возможно, стоит добавить, что я полный новичок в криптографии.

Ответы [ 3 ]

2 голосов
/ 11 августа 2011

Страница man SunOS для des (которая, кажется, основана на том, на чем основан ваш des.exe?), Указывает, что их ключ генерируется следующим образом:

Алгоритм DES требует 8-байтовый ключ, чьи младшие биты предполагаются битами с нечетной четностью. Ключ ASCII, предоставляемый пользователем, дополняется нулями до 8 байтов, а старшие биты устанавливаются как биты с нечетной четностью. Затем алгоритм DES игнорирует младший бит каждого символа ASCII, но информация этого бита была сохранена в старшем бите из-за четности.

В нем также упоминается, что начальный IV всегда обнуляется, независимо от того, в каком режиме вы работаете

Режим работы CBC всегда использует начальное значение всех нулей для вектора инициализации, поэтому первые 8 байтов файла шифруется одинаково в режиме CBC или ECB.

В нем также упоминается, что используемый заполнитель таков, что последний байт всегда имеет значение от 0 до 7, указывающее количество используемых байтов заполнения. Это похоже на PKCS5Padding, так что, возможно, это будет работать

Поскольку режимы CBC и ECB в DES требуют, чтобы единицы из 8 байтов были зашифрованные, файлы, зашифрованные командой des, имеют от 1 до 8 байтов добавлены к ним, чтобы они были кратны 8 байтов. Последний Байт, когда расшифрован, дает количество байтов (от 0 до 7), которые должны быть сохраненным из последних 8 байтов. Другие байты из тех, которые добавлены к входные данные рандомизированы перед шифрованием.

В зависимости от параметров, которые вы указали, вы используете, похоже, что вы используете DES / CBC / PKCS5Padding для шифра.

Я думаю, что остается только определить, как на самом деле получить ключ. Я нашел этот пример кода в exampledepot , который может работать для вас. Я думаю, вам просто нужно преобразовать ваш строковый пароль в 8 байтов (1 байт на символ, поэтому кодировки UTF не требуется), а затем заполнить его кодом, приведенным в примере, для получения ключа. В любом случае, стоит попробовать.

0 голосов
/ 26 ноября 2013

У меня была такая же проблема с C #.Я решил это в конце концов.Вы можете посмотреть мой ответ здесь: Вектор инициализации DES в C #

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

0 голосов
/ 11 августа 2011

Ключи DES имеют 7 (очевидно, SunJCE использует 7?) Или 8 байтов. Убедитесь, что предоставленная вами строка имеет размер 7 или 8 байт. Если так, то шансы хорошие, это грубый ключ. В противном случае это могло бы быть закодировано некоторым способом. Дешевой раздачей для шестнадцатеричного кодирования будет префикс 0x или суффикс h, а все символы будут в диапазоне 0-9, A-F. Вы, конечно, можете конвертировать из hex самостоятельно или использовать какой-то код в сети, но я обычно использую Apache commons lib (http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html).

Тем не менее, это действительно предположение, и я не уверен, что мы можем прийти к выводу, что это проблема только с ключом. У вас есть другая информация о предполагаемом алгоритме шифрования? Если процитированный вами исполняемый файл работает с «-d», то кажется, что шифрование в режиме CBC - простое DES:

-b: шифрование с использованием DES в режиме шифрования ecb, по умолчанию - режим cbc .

(возможны несколько режимов, см. http://download.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#AppA)

Я бы попробовал установить ваш шифр на "DES / CBC".

Опять же, я не уверен, как это интерпретировать:

По умолчанию - tripple cbc

Вы можете использовать этот фрагмент, чтобы сообщить, какие шифры доступны в вашей системе: http://www.java2s.com/Code/Java/Security/ListAllProviderAndItsAlgorithms.htm

...