Crypto++ 等价于 PHP mcrypt_encrypt MCRYPT_3DES/MCRYPT_MODE_CBC
Crypto++ equivalent to 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;
}
但它们return 不是相同的加密文本。我希望将 C++ 代码更改为等同于 PHP 代码,而不是相反。
对于以下密钥和消息:
$key = "keykeykeykeykeykeykeykey";
$msg = $key;
PHP代码return是一个24字节的密文(base64编码为):
a78URfI6EV8m3sTaDDDrntI8VbjWHiwm
但 C++ return 是一个 32 字节的密文,但具有 24 字节的匹配前缀(base64 编码为):
a78URfI6EV8m3sTaDDDrntI8VbjWHiwm9M15+pzUnuM=
所以,C++ 版本中有一些额外的字节,我不知道它们来自哪里。我认为它可能与填充方案有关,但我不知道 PHP.
使用的填充方案
实际上,这是填充。 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;
}
我有以下 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;
}
但它们return 不是相同的加密文本。我希望将 C++ 代码更改为等同于 PHP 代码,而不是相反。
对于以下密钥和消息:
$key = "keykeykeykeykeykeykeykey";
$msg = $key;
PHP代码return是一个24字节的密文(base64编码为):
a78URfI6EV8m3sTaDDDrntI8VbjWHiwm
但 C++ return 是一个 32 字节的密文,但具有 24 字节的匹配前缀(base64 编码为):
a78URfI6EV8m3sTaDDDrntI8VbjWHiwm9M15+pzUnuM=
所以,C++ 版本中有一些额外的字节,我不知道它们来自哪里。我认为它可能与填充方案有关,但我不知道 PHP.
使用的填充方案实际上,这是填充。 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;
}