#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);