Расшифровка DES с помощью OpenSSL - PullRequest
1 голос
/ 23 октября 2011

Я пытаюсь расшифровать файл, зашифрованный DES, из внешнего источника с помощью известного ключа и IV, используя OpenSSL (другие библиотеки на самом деле не вариант, так как приложение уже ссылается на него, и я не хочу ввести новые зависимости). Это приложение Qt, поэтому данные поступают и выводятся как QByteArrays.

Вот код, который у меня есть на данный момент (установлен для записи расшифрованных данных в файл для проверки):

AmzHandler::AmzHandler(QByteArray encoded)
{
    QByteArray encrypted = QByteArray::fromBase64(encoded);
    QByteArray decrypted = decrypt(encrypted);
    QFile fred ("decrypted");
    fred.open(QFile::WriteOnly);
    fred.write(decrypted);
    fred.close();
}

QByteArray AmzHandler::decrypt(QByteArray encrypted)
{
    DES_cblock key = {0x29, 0xab, 0x9d, 0x18, 0xb2, 0x44, 0x9e, 0x31};
    DES_cblock iv = {0x5e, 0x72, 0xd7, 0x9a, 0x11, 0xb3, 0x4f, 0xee};
    DES_key_schedule schedule;
    unsigned char decrypted[encrypted.size()];

    DES_set_odd_parity(&key);
    DES_set_key_checked(&key, &schedule);

    DES_ncbc_encrypt((unsigned char * )encrypted.constData(), (unsigned char * )decrypted, encrypted.size(), &schedule, &iv, DES_DECRYPT);

    return QByteArray::fromRawData((char * )decrypted, length);
}

Выходной файл для моего тестового ввода не имеет смысла и не согласован для нескольких прогонов. (У меня есть рабочая реализация на Python, которая прилагается в конце этого поста, чтобы проверить.) Я не совсем уверен, что происходит; сделал ли я несколько простых ошибок в преобразованиях в char или неправильно использую OpenSSL.

РЕДАКТИРОВАТЬ: Решено. Оказывается, строка DES_set_odd_parity(&key); отсутствовала. Добавьте это, и это работает.

Вот рабочий код на Python:

def AmzHandler(encoded):
    encrypted = base64.b64decode(encoded)
    d = pyDes.des(hex_to_str("29AB9D18B2449E31"), mode=pyDes.CBC, IV=hex_to_str("5E72D79A11B34FEE"))
    decrypted = d.decrypt(encrypted)
    f = open("decrypted-py", "w")
    f.write(decrypted)
    f.close()

1 Ответ

2 голосов
/ 27 октября 2011

Проблема заключалась в пропущенном вызове DES_set_odd_parity(&key);, который необходим для правильного декодирования в этой реализации.Рабочий код выглядит следующим образом:

QByteArray AmzHandler::decrypt(QByteArray encrypted)
{
    DES_cblock key = {0x29, 0xab, 0x9d, 0x18, 0xb2, 0x44, 0x9e, 0x31};
    DES_cblock iv = {0x5e, 0x72, 0xd7, 0x9a, 0x11, 0xb3, 0x4f, 0xee};
    DES_key_schedule schedule;
    unsigned char decrypted[encrypted.size()];

    DES_set_odd_parity(&key);
    DES_set_key_checked(&key, &schedule);

    DES_ncbc_encrypt((unsigned char * )encrypted.constData(), (unsigned char * )decrypted, encrypted.size(), &schedule, &iv, DES_DECRYPT);

    return QByteArray::fromRawData((char * )decrypted, length);
}
...