Crypto++ ошибка паддинга
От: Molchalnik  
Дата: 22.05.25 03:58
Оценка:
Коллеги, следующий код, внешне безобидный, даёт на этапе расшифровки (Decrypt) плавающую ошибку паддинга. Помогите, пожалуйста, исправить


void Encrypt(const uint8_t* plaintext, size_t text_size, uint8_t* ciphertext) override {
    CryptoPP::ECB_Mode<CryptoPP::AES>::Encryption encryptor;
    encryptor.SetKey(key_.data(), key_.size());

    CryptoPP::ByteQueue queue;
    CryptoPP::StreamTransformationFilter filter(encryptor, new CryptoPP::Redirector(queue),
                                                CryptoPP::BlockPaddingSchemeDef::PKCS_PADDING);

    filter.Put(plaintext, text_size);
    filter.MessageEnd();

    queue.Get(ciphertext, queue.MaxRetrievable());  // Считываем данные в выходной буфер
  }

  void Decrypt(const uint8_t* ciphertext, uint8_t* plaintext, size_t size, size_t& out_text_size) override {
    CryptoPP::ECB_Mode<CryptoPP::AES>::Decryption decryptor;
    decryptor.SetKey(key_.data(), key_.size());

    CryptoPP::ByteQueue queue;
    CryptoPP::StreamTransformationFilter filter(decryptor, new CryptoPP::Redirector(queue),
                                                CryptoPP::BlockPaddingSchemeDef::PKCS_PADDING);

    filter.Put(ciphertext, size);
    filter.MessageEnd();

    out_text_size = queue.MaxRetrievable();  // Получаем реальный размер расшифрованных данных
    queue.Get(plaintext, out_text_size);     // Записываем в выходной буфер
  }

size_t GetEncryptedTextSize(size_t text_size) override {
    if (text_size == 0) {
        return CryptoPP::AES::BLOCKSIZE; // Минимальный размер с padding
    }
    size_t remainder = text_size % CryptoPP::AES::BLOCKSIZE;
    return remainder == 0 ? text_size + CryptoPP::AES::BLOCKSIZE 
                         : text_size + (CryptoPP::AES::BLOCKSIZE - remainder);
}


Логика кода такая — сначала вызываем GetEncryptedTextSize, узнаём размер зашифрованного текста, создаём под этот размер буфер, вызываем Encrypt, потом (когда и где надо) вызываем Decrypt

при этом иногда (в зависимости от положения звёзд и ретроградного меркурия) возникает ошибка паддинга, а иногда нет. нужно чтобы стабильно НЕ возникала!!!
Отредактировано 22.05.2025 4:00 Molchalnik . Предыдущая версия . Еще …
Отредактировано 22.05.2025 3:59 Molchalnik . Предыдущая версия .
Re: Crypto++ ошибка паддинга
От: Doom100500 Израиль  
Дата: 22.05.25 05:45
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>Коллеги, следующий код, внешне безобидный, даёт на этапе расшифровки (Decrypt) плавающую ошибку паддинга. Помогите, пожалуйста, исправить

  code
M>
M>void Encrypt(const uint8_t* plaintext, size_t text_size, uint8_t* ciphertext) override {
M>    CryptoPP::ECB_Mode<CryptoPP::AES>::Encryption encryptor;
M>    encryptor.SetKey(key_.data(), key_.size());

M>    CryptoPP::ByteQueue queue;
M>    CryptoPP::StreamTransformationFilter filter(encryptor, new CryptoPP::Redirector(queue),
M>                                                CryptoPP::BlockPaddingSchemeDef::PKCS_PADDING);

M>    filter.Put(plaintext, text_size);
M>    filter.MessageEnd();

M>    queue.Get(ciphertext, queue.MaxRetrievable());  // Считываем данные в выходной буфер
M>  }

M>  void Decrypt(const uint8_t* ciphertext, uint8_t* plaintext, size_t size, size_t& out_text_size) override {
M>    CryptoPP::ECB_Mode<CryptoPP::AES>::Decryption decryptor;
M>    decryptor.SetKey(key_.data(), key_.size());

M>    CryptoPP::ByteQueue queue;
M>    CryptoPP::StreamTransformationFilter filter(decryptor, new CryptoPP::Redirector(queue),
M>                                                CryptoPP::BlockPaddingSchemeDef::PKCS_PADDING);

M>    filter.Put(ciphertext, size);
M>    filter.MessageEnd();

M>    out_text_size = queue.MaxRetrievable();  // Получаем реальный размер расшифрованных данных
M>    queue.Get(plaintext, out_text_size);     // Записываем в выходной буфер
M>  }

M>size_t GetEncryptedTextSize(size_t text_size) override {
M>    if (text_size == 0) {
M>        return CryptoPP::AES::BLOCKSIZE; // Минимальный размер с padding
M>    }
M>    size_t remainder = text_size % CryptoPP::AES::BLOCKSIZE;
M>    return remainder == 0 ? text_size + CryptoPP::AES::BLOCKSIZE 
M>                         : text_size + (CryptoPP::AES::BLOCKSIZE - remainder);
M>}
M>


M>Логика кода такая — сначала вызываем GetEncryptedTextSize, узнаём размер зашифрованного текста, создаём под этот размер буфер, вызываем Encrypt, потом (когда и где надо) вызываем Decrypt


M>при этом иногда (в зависимости от положения звёзд и ретроградного меркурия) возникает ошибка паддинга, а иногда нет. нужно чтобы стабильно НЕ возникала!!!


Я не спец в Crypto++, но когда говорят "в зависимости от положения звёзд и ретроградного меркурия", то часто оказывается, что проблема где-то в хреновой синхронизации между потоками (у себя, либо в библиотеке)
Спасибо за внимание
Re[2]: Crypto++ ошибка паддинга
От: Molchalnik  
Дата: 22.05.25 13:09
Оценка:
Здравствуйте, Doom100500, Вы писали:


M>>при этом иногда (в зависимости от положения звёзд и ретроградного меркурия) возникает ошибка паддинга, а иногда нет. нужно чтобы стабильно НЕ возникала!!!


D>Я не спец в Crypto++, но когда говорят "в зависимости от положения звёзд и ретроградного меркурия", то часто оказывается, что проблема где-то в хреновой синхронизации между потоками (у себя, либо в библиотеке)


нет там никакой многопоточки. по крайней мере, в моей части, а что там внутри crypto++ хз
Re: Crypto++ ошибка паддинга
От: DiPaolo Россия  
Дата: 22.05.25 13:21
Оценка:
Где именно появляется ошибка и какая именно? Погляди в сорцы криптоПП — думаю станет понятнее.
Патриот здравого смысла
Re: Crypto++ ошибка паддинга
От: kov_serg Россия  
Дата: 22.05.25 16:12
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>Коллеги, следующий код, внешне безобидный, даёт на этапе расшифровки (Decrypt) плавающую ошибку паддинга. Помогите, пожалуйста, исправить

M>Логика кода такая — сначала вызываем GetEncryptedTextSize, узнаём размер зашифрованного текста, создаём под этот размер буфер, вызываем Encrypt, потом (когда и где надо) вызываем Decrypt
M>при этом иногда (в зависимости от положения звёзд и ретроградного меркурия) возникает ошибка паддинга, а иногда нет. нужно чтобы стабильно НЕ возникала!!!

Может стоит немного поменять GetEncryptedTextSize ?
size_t GetEncryptedTextSize(size_t text_size) override {
    if (text_size == 0) return CryptoPP::AES::BLOCKSIZE;
    text_size += CryptoPP::AES::BLOCKSIZE-1;
    return text_size - text_size%CryptoPP::AES::BLOCKSIZE;
}
Re: Crypto++ ошибка паддинга
От: pva  
Дата: 23.05.25 06:19
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>Коллеги, следующий код, внешне безобидный, даёт на этапе расшифровки (Decrypt) плавающую ошибку паддинга. Помогите, пожалуйста, исправить

Ошибка паддинга на одном и том же входе? Или на разных? В одной из старых версий библиотеки у меня было что-то похожее. Решалось то ли сменой типа паддинга, то ли ручной реализацией обрезания хвоста по PKCS.
Ну и на всякий случай, потоковый ECB не рекомендуют.
newbie
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.