Рейтинг:0

Дополнительные байты при расшифровке с помощью OpenSSL

флаг fr

Строка зашифрована со следующими свойствами (с использованием C#):

myAes.Mode = CipherMode.CBC

myAes.KeySize = 128

myAes.Padding = PaddingMode.PKCS7

myAes.BlockSize = 128

myAes.FeedbackSize = 128

Ключ: 5753B8AA97BE5B5D9584864DF3134E64

Это моя функция расшифровки:

int AESdecrypt (символ без знака * зашифрованный текст, size_t ciphertext_len, символ без знака * ключ, символ без знака * iv, символ без знака * открытый текст)
  {
    EVP_CIPHER_CTX *ctx;

    внутр. лен;
      интервал retErrors=1;

    интервал открытый_текст_len;

    /* Создаем и инициализируем контекст */
    если(!(ctx = EVP_CIPHER_CTX_new()))
    {
        LOGF_TRACE("\t Ошибка в EVP_CIPHER_CTX_new");
        EVP_CIPHER_CTX_free(ctx);
        вернуть 0;
    }

    /*
     * Инициализировать операцию расшифровки. ВАЖНО - убедитесь, что вы используете ключ
     * и размер IV, соответствующий вашему шифру
     * В этом примере мы используем 256-битный AES (т. е. 256-битный ключ).
     * Размер IV для *большинства* режимов такой же, как размер блока. Для AES это
     * 128 бит
     */
    if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, ключ, iv))
    {
      LOGF_TRACE("\t Ошибка в EVP_DecryptInit_ex");
      EVP_CIPHER_CTX_free(ctx);
      вернуть 0;
    }

    /*
     * Предоставьте сообщение для расшифровки и получите вывод в виде открытого текста.
     * При необходимости EVP_DecryptUpdate может вызываться несколько раз.
     */
    if(1 != EVP_DecryptUpdate(ctx, открытый текст, &len, зашифрованный текст, ciphertext_len))
    {
      LOGF_TRACE("\t EVP_DecryptUpdate");
      EVP_CIPHER_CTX_free(ctx);
      вернуть 0;
    }
        
    длина_текста = длина;

    /*
     * Завершите расшифровку. Дальнейшие байты открытого текста могут быть записаны в
     * этот этап.
     */
    if(1 != EVP_DecryptFinal_ex(ctx, открытый текст + длина, &длина))
    {
      LOGF_TRACE("\t EVP_DecryptFinal_ex");
      EVP_CIPHER_CTX_free(ctx);
      вернуть 0;
    }
        
    длина_текста += длина;

    /* Очистка */
    EVP_CIPHER_CTX_free(ctx);

    вернуть открытый текст_len;
  }

Однако, когда я пытаюсь расшифровать результирующую строку, есть 16 (0x10) дополнительных байтов: (Удалены некоторые символы из соображений безопасности).

0000 - 2e 3c 81 6b ed 2e 6b 59-fe 38 ae b7 56 11 1f c2 .<.k..kY.8..V...

0010 - 45 53 54 41 20 45 53 20-55 4e 41 20 50 52 55 45 ЭСТА ЕС УНА ПРЮ

0020 - 42 41 20 44 45 20 43 49-46 52 41 44 4f 20 41 45 BA DE CIFRADO AE

0030 - 53 20 50 41 52 41 20 45-54 48 45 52 4e 45 54 20 S PARA ETHERNET

0040 - ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ-ХХ ХХ ХХ ХХХХХХХХХ

Я хотел бы знать, нормально ли это, и я должен просто удалить первые 16 байтов или как избежать этих лишних байтов (мне это не кажется нормальным).

Может ли это иметь какое-то отношение к IV, который они используют для шифрования?

Спасибо.

Рейтинг:3
флаг my

Из ваших симптомов может показаться, что IV включен в зашифрованный текст (как первые 16 байтов); вы оставляете его включенным, когда вызываете AESdecrypt.

Если да, то у вас есть два варианта:

  • Извлеките первые 16 байтов из зашифрованного текста; передать эти 16 байтов как IV, а остальные (то есть с удаленными первыми 16 байтами) как зашифрованный текст

  • Делайте то, что вы делаете, и обрежьте первые 16 байтов расшифрованного открытого текста.

Кстати: в режиме CBC, как правило, рекомендуется включать какой-либо код аутентификации сообщения (будь то CMAC, HMAC или что-то еще), который гарантирует, что кто-то не сможет изменить зашифрованный текст, не будучи обнаруженным (так как в противном случае злоумышленник может быть возможность изменять зашифрованный текст и иметь некоторый контроль над тем, как это изменяет расшифровку). Вы что-то делаете, чтобы защититься от этого?

David Merinos avatar
флаг fr
Будет ли она решена, если зашифрованный текст сгенерирован с IV из 16 нулей? Потому что я использую IV из 16 нулей для расшифровки. Что касается аутентификации, мы все еще работаем над этим.
David Merinos avatar
флаг fr
Кроме того, можем ли мы быть уверены, что OpenSSL использует PKCS#7 для расшифровки по умолчанию?
poncho avatar
флаг my
@DavidMerinos: IV из всех нулей подходит, если это единственное сообщение, которое будет зашифровано с помощью этого ключа; если вы повторно используете ключ для шифрования нескольких сообщений (что обычно, но не всегда), вы должны выбрать непредсказуемый IV для каждого.
David Merinos avatar
флаг fr
Интересно. Но решит ли это проблему с дополнительными 16 байтами?
poncho avatar
флаг my
@DavidMerinos: о проблеме с дополнительными 16 байтами см. ответ; мой комментарий был конкретно об идее использования IV с нулевым значением (работает, если вы шифруете только одно сообщение; не так хорошо, если вы шифруете несколько сообщений одним и тем же ключом)
poncho avatar
флаг my
@DavidMerinos: Кстати: вы уверены, что проблема в 16 дополнительных байтах впереди, а не в первых 16 байтах, расшифрованных как тарабарщина (а остальные в порядке) - последнее указывает на то, что вы ошиблись в IV (и все остальное было правильно)
David Merinos avatar
флаг fr
Что ж, я знаю, что расшифровано сообщение: «ESTA ES UNA PRUEBA DE CIFRADO AES PARA ETHERNET XXXXXXXX». Я не получаю IV от шифрующей стороны; что я делаю, так это устанавливаю IV как массив из 16 нулей. Я попытаюсь извлечь эти первые 16 байтов. Означает ли это, что мне нужно обрезать его перед попыткой расшифровки?
dave_thompson_085 avatar
флаг cn
@DavidMerinos: да, OpenSSL _EVP для блочных режимов_ по умолчанию использует заполнение, называемое PKCS5 или PKCS7, в зависимости от того, когда было сделано наименование. Если бы это было не так, вы бы добавили мусор или удалили правильные значения в _конце_ открытого текста. Другие части OpenSSL отличаются.
David Merinos avatar
флаг fr
Сегодня я провел тест, в котором я шифрую одно и то же сообщение, используя IV из нулей, затем расшифровываю его с тем же IV, и я не получаю лишних байтов, поэтому мы можем сделать вывод, что проблема в этом.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.