Дешифрование AES-128-ECB «не удается» из-за заполнения после перехода с OpenSSL 1.0.2b на 3.3.0C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Дешифрование AES-128-ECB «не удается» из-за заполнения после перехода с OpenSSL 1.0.2b на 3.3.0

Сообщение Anonymous »

У меня есть тестовая программа, которая работает при подключении к OpenSSL 1.0.2b, но не работает с OpenSSL 3.0.0 и OpenSSL 3.3.0. Я считаю, что проблема связана со шифрованием, поскольку расшифровка программно завершается успешно (не возвращает ошибок), но открытый текст все еще содержит заполнение.
Если входная длина делится на размер блока, блок заполнение ожидаемым значением добавляется к восстановленному открытому тексту (но не удаляется после расшифровки). Открытый текст на целый блок длиннее, чем ожидалось, с предсказуемым дополнительным блоком. Ожидаемым значением всегда является количество дополненных байтов, поэтому для полного блока заполнения вы получаете 16 байтов 0x10 (16).
Например: открытый текст заканчивается на четном блоке с помощью:< /p>

Код: Выделить всё

...                      0x01 0x02 0x03
Восстановленный открытый текст заканчивается на:

Код: Выделить всё

...                      0x01 0x02 0x03

Код: Выделить всё

0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10

Код: Выделить всё

0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10
Если входная длина не делится на размер блока, предпоследний блок открытого текста дополняется окончательным открытым текстом (например, если был 1 неделимый байт по размеру блока и этому байту было установлено значение 0x31, вы видите целый блок 0x31), за которым следует еще один блок заполнения с ожидаемым значением (все еще не удаленным после расшифровки). Открытый текст длиннее ожидаемого более чем на один блок (но менее двух полных блоков) и непредсказуем, если не знать исходную длину открытого текста.
Например: открытый текст заканчивается на неполном блоке с помощью:< /p> Восстановленный открытый текст заканчивается дополненным этим блоком плюс обычный заполняющий блок:

Код: Выделить всё

0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01

Код: Выделить всё

0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01

Код: Выделить всё

0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10

Код: Выделить всё

0x10 0x10 0x10 0x10 0x10 0x10 0x10 0x10
Я пробовал явно включать заполнение, явно отключать заполнение и предварительно получать контекст шифрования, но, похоже, ничего не изменилось. При отключенном заполнении я не получаю в конце полный блок размером 0x10, но все равно получаю остатки заполнения, когда размер ввода не делится на размер блока.
Ключ – 16. байт (128 бит), а размер входного и выходного буферов как минимум на 2 блока больше, чем необходимо.
Не могу поверить, что я единственный, кто это видит, если только все не смогли это увидеть. избавиться от ECB (хотя мне нужно расшифровать уже существующие файлы).
Вот шифрование:

Код: Выделить всё

// Encrypt data_length bytes of data into enc_data using key
EVP_CIPHER_CTX* ctx{EVP_CIPHER_CTX_new()};
if ( !ctx ) {
return -1;
}

EVP_CIPHER* cipher{EVP_CIPHER_fetch(nullptr, "AES-128-ECB", nullptr)};
if ( !cipher ) {
return -1;
}

// Explicitly enable padding - doesn't seem to matter
int padding{1};
OSSL_PARAM params[2];
params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_PADDING,&padding);
params[0] = OSSL_PARAM_construct_end();

if ( EVP_EncryptInit_ex2(ctx,cipher,key,nullptr,params) != 1 ) {
return -1;
}

int input_ptr{0};
int output_ptr{0};
// Encrypt until the output_ptr meets or exceeds the input data_length
while ( output_ptr < data_length ) {
int this_enc_len{0};
if ( EVP_EncryptUpdate(ctx,reinterpret_cast(enc_data) + output_ptr,&this_enc_len,reinterpret_cast(data) + input_ptr, data_length - input_ptr) != 1 ) {
return -1;
}
input_ptr += this_enc_len;
output_ptr += this_enc_len;
}

int final_enc_len{0};
if ( EVP_EncryptFinal_ex(ctx,reintrepret_cast(enc_data) + output_ptr,&final_enc_len) != 1 ) {
return -1;
}
output_ptr += final_enc_len;

// Cleanup omitted for brevity
return output_ptr;
Заполнение добавляется всегда, независимо от того, включено оно явно или отключено. Входные размеры, которые делятся на размер блока без остатка, не дополняются; в противном случае они дополняются до четной длины в 16 байт.
Расшифровка аналогична:

Код: Выделить всё

// Decrypt data_length bytes of data into dec_data using key
EVP_CIPHER_CTX* ctx{EVP_CIPHER_CTX_new()};
if ( !ctx ) {
return -1;
}

EVP_CIPHER* cipher{EVP_CIPHER_fetch(nullptr, "AES-128-ECB", nullptr)};
if ( !cipher ) {
return -1;
}

// Explicitly enable padding - doesn't seem to matter here either
int padding{1};
OSSL_PARAM params[2];
params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_PADDING,&padding);
params[0] = OSSL_PARAM_construct_end();

if ( EVP_DecryptInit_ex2(ctx,cipher,key,nullptr,params) != 1 ) {
return -1;
}

int input_ptr{0};
int output_ptr{0};
while ( output_ptr < data_length ) {
int this_enc_len{0};
if ( EVP_DecryptUpdate(ctx,reinterpret_cast(dec_data) + output_ptr,&this_enc_len,reinterpret_cast(data) + input_ptr, data_length - input_ptr) != 1 ) {
return -1;
}
input_ptr += this_enc_len;
output_ptr += this_enc_len;
}

int final_enc_len{0};
if ( EVP_DecryptFinal_ex(ctx,reinterpret_cast(dec_data) + output_ptr,&final_enc_len) != 1 ) {
return -1;
}
output_ptr += final_enc_len;

// Cleanup again omitted for brevity
return output_ptr;
Кто-нибудь еще видел это? Вы нашли решение или обходной путь?

Подробнее здесь: https://stackoverflow.com/questions/785 ... nssl-1-0-2
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Дешифрование AES-128-ECB «не удается» из-за заполнения после перехода с OpenSSL 1.0.2b на 3.3.0
    Anonymous » » в форуме C++
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Дверной замок Туя - AES-128 ECB PKCS7Padding - PHP
    Anonymous » » в форуме Php
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Портирование python aes ecb на php openssl
    Гость » » в форуме Php
    0 Ответы
    35 Просмотры
    Последнее сообщение Гость
  • Как доказать 128-битное шифрование и дешифрование AES на Arduino [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    56 Просмотры
    Последнее сообщение Anonymous
  • AES-128 GCM (аутентифицированное дешифрование в режиме Галуа/счетчика)
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»