Проблема с памятью для дешифрования

#c #crypto

#c #крипто

Вопрос:

Недавно я создавал сервер, который использует AES256 для шифрования / дешифрования данных, потребовалось некоторое время, чтобы заставить его правильно отправлять. Однако теперь у меня возникла проблема, которая, как я полагаю, связана с памятью, если я отправлю слово «hello», оно будет расшифровано нормально, если я затем отправлю «helloo», оно также будет расшифровано нормально, но если я отправлю что-нибудь короче, чем «helloo» после, это приведет к ошибке во время расшифровки, и если вы напечатаете полученную зашифрованную строку, она получит то, что должна, плюс дополнительную длину старой строки.

например

 hello:  ####################
helloo: ##############################
hi:     #####(#########################) //has the additional length made up from the encrypted string of "helloo" minus the first however many characters "hi" is
  

Код:

 std::string decryptString(std::string ciphertext, byte *key, byte *iv)
{
    std::string decodedtext;
    CryptoPP::StringSource(ciphertext, true, 
                           new CryptoPP::HexDecoder(new CryptoPP::StringSink(decodedtext)));

    std::string plaintext;

    CryptoPP::GCM<CryptoPP::AES>::Decryption dec;
    dec.SetKeyWithIV((const byte *)key, CryptoPP::AES::MAX_KEYLENGTH, 
                     (const byte *)iv, CryptoPP::AES::BLOCKSIZE);

    CryptoPP::AuthenticatedDecryptionFilter adf(dec, new CryptoPP::StringSink(plaintext));

    adf.Put((const byte *)decodedtext.data(), decodedtext.size());
    adf.MessageEnd();

    return plaintext;
}
  

Комментарии:

1. я бы предположил, что вы не повторно инициализируете свой буфер для зашифрованного вывода, но без кода… трудно сказать

2. Теперь опубликуйте код, который выполняет шифрование .

3. можете ли вы показать нам код, который вызывает decryptString(…) ? я думаю, cyphertext что старая строка все еще содержится, когда вы вводите новую… попробуйте написать после символов новой строки

4. Кстати, когда функция принимает const byte * в качестве аргумента и у вас есть byte * , вам не нужно приводить ее к const byte * . (Заметьте, это не имеет никакого отношения к вашей проблеме.)

5. Каков размер вашего ключа и iv? И как вы их инициализируете? Каков размер тега? И как выглядит процедура шифрования? В Crypto wiki есть пример в режиме GCM .

Ответ №1:

Попробуйте использовать valgrind, чтобы найти ошибки памяти в вашем коде.

О, и совет: опубликуйте сам код, это может привести к более интересным ответам.

Комментарии:

1. Я попробую использовать то, что вы упомянули, я также добавил код в сообщение.

Ответ №2:

Если вы всегда передаете один и тот же вектор инициализации этому методу, возможно, причина в этом. Попробуйте

 dec.Resynchronize(iv);