Сообщение Crypto++ ошибка паддинга от 22.05.2025 3:58
Изменено 22.05.2025 3:59 Molchalnik
Crypto++ ошибка паддинга
Коллеги, следующий код, внешне безобидный, даёт на этапе расшифровки (Decrypt) плавающую ошибку паддинга. Помогите, пожалуйста, исправить
| Подробности | |
| [сcode] 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); } [/сcode] Логика кода такая — сначала вызываем GetEncryptedTextSize, узнаём размер зашифрованного текста, создаём под этот размер буфер, вызываем Encrypt, потом (когда и где надо) вызываем Decrypt при этом иногда (в зависимости от положения звёзд и ретроградного меркурия) возникает ошибка паддинга, а иногда нет. нужно чтобы стабильно НЕ возникала!!! | |
Crypto++ ошибка паддинга
Коллеги, следующий код, внешне безобидный, даёт на этапе расшифровки (Decrypt) плавающую ошибку паддинга. Помогите, пожалуйста, исправить
[сcode]
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);
}
[/сcode]
Логика кода такая — сначала вызываем GetEncryptedTextSize, узнаём размер зашифрованного текста, создаём под этот размер буфер, вызываем Encrypt, потом (когда и где надо) вызываем Decrypt
при этом иногда (в зависимости от положения звёзд и ретроградного меркурия) возникает ошибка паддинга, а иногда нет. нужно чтобы стабильно НЕ возникала!!!
[сcode]
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);
}
[/сcode]
Логика кода такая — сначала вызываем GetEncryptedTextSize, узнаём размер зашифрованного текста, создаём под этот размер буфер, вызываем Encrypt, потом (когда и где надо) вызываем Decrypt
при этом иногда (в зависимости от положения звёзд и ретроградного меркурия) возникает ошибка паддинга, а иногда нет. нужно чтобы стабильно НЕ возникала!!!