c ++ — эквивалент Crypto ++ для PHP mcrypt_encrypt MCRYPT_3DES / MCRYPT_MODE_CBC

У меня есть следующий код PHP для шифрования текста с помощью ключа:

function des_ed3_crypt($msg, $key) {
$bytes = array(0,0,0,0,0,0,0,0);
$iv=implode(array_map('chr', $bytes));

return mcrypt_encrypt(MCRYPT_3DES, $key, $msg, MCRYPT_MODE_CBC, $iv);
}

И моя соответствующая функция C ++, использующая Crypto ++:

std::string des_ed3_crypt(std::string const& msg, std::string const& key)
{
unsigned char iv[8] = { 0 }; // 0-filled

CryptoPP::CBC_Mode<CryptoPP::DES_EDE3>::Encryption e;
e.SetKeyWithIV(reinterpret_cast<unsigned char const*>(key.c_str()),
key.size(), iv);

std::string ret;

CryptoPP::StringSource(msg, true,
new CryptoPP::StreamTransformationFilter
(e, new CryptoPP::StringSink(ret)));

return ret;
}

Но они не возвращают одинаковый зашифрованный текст. Я хочу, чтобы изменение кода C ++ стало эквивалентным коду PHP, а не наоборот.

Для следующего ключа и сообщения:

$key = "keykeykeykeykeykeykeykey";
$msg = $key;

PHP-код возвращает 24-байтовый шифротекст (в кодировке base64):

a78URfI6EV8m3sTaDDDrntI8VbjWHiwm

Но C ++ возвращает зашифрованный текст из 32 байтов, но с совпадающим префиксом из 24 байтов (base64 кодируется как):

a78URfI6EV8m3sTaDDDrntI8VbjWHiwm9M15+pzUnuM=

Итак, в версии C ++ есть несколько дополнительных байтов, которые я не знаю, откуда они берутся. Я думаю, что это может быть связано со схемой заполнения, но я не знаю схему заполнения, используемую PHP.

1

Решение

По сути, это было дополнение. PHP mcrypt_crypto Функция применяет заполнение нулями, поэтому мне нужно только указать cryptopp что я хочу применить нулевое заполнение для шифрования:

std::string des_ed3_crypt(std::string const& msg, std::string const& key)
{
unsigned char iv[8] = { 0 }; // 0-filled

CryptoPP::CBC_Mode<CryptoPP::DES_EDE3>::Encryption e;
e.SetKeyWithIV(reinterpret_cast<unsigned char const*>(key.c_str()),
key.size(), iv);

std::string ret;

CryptoPP::StringSource(msg, true,
new CryptoPP::StreamTransformationFilter
(e, new CryptoPP::StringSink(ret),
CryptoPP::BlockPaddingSchemeDef::BlockPaddingScheme::ZEROS_PADDING));

return ret;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]