加密++;相当于PHP mcrypt_encrypt mcrypt_3DES/mcrypt_MODE_CBC
我使用以下PHP代码使用密钥加密文本:加密++;相当于PHP mcrypt_encrypt mcrypt_3DES/mcrypt_MODE_CBC,php,c++,crypto++,3des,Php,C++,Crypto++,3des,我使用以下PHP代码使用密钥加密文本: 函数des_ed3_crypt($msg,$key){ $bytes=数组(0,0,0,0,0,0,0,0); $iv=内爆(数组映射($chr',$bytes)); 返回mcrypt_encrypt(mcrypt_3DES,$key,$msg,mcrypt_MODE_CBC,$iv); } 和我相应的C++函数,使用密码+++为: std::string des_ed3_crypt(std::string const&msg,std::string c
函数des_ed3_crypt($msg,$key){
$bytes=数组(0,0,0,0,0,0,0,0);
$iv=内爆(数组映射($chr',$bytes));
返回mcrypt_encrypt(mcrypt_3DES,$key,$msg,mcrypt_MODE_CBC,$iv);
}
和我相应的C++函数,使用密码+++为:
std::string des_ed3_crypt(std::string const&msg,std::string const&key)
{
无符号字符iv[8]={0};//0-filled
CryptoPP::CBC_模式::加密e;
e、 SetKeyWithIV(重新解释强制转换(key.c_str()),
键。大小(),iv);
std::字符串ret;
CryptoPP::StringSource(msg,true,
新的CryptoPP::StreamTransformationFilter
(e,新的CryptoPP::StringSink(ret));
返回ret;
}
但它们不会返回相同的加密文本。我希望改变C++代码,使其等同于PHP代码,而不是相反。
对于以下键和消息:
$key=“keykey”;
$msg=$key;
PHP代码返回24字节的密码文本(base64编码为):
a78urfi6ev8m3staddrnti8vbjwhiwm
但C++返回32字节的密文,但匹配的前缀为24字节(BASE64编码为):
A78URFI6EV8M3STADDRNTI8VBJWHIWM9M15+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;
}
std::string des_ed3_crypt(std::string const&msg,std::string const&key)
{
无符号字符iv[8]={0};//0-filled
CryptoPP::CBC_模式::加密e;
e、 SetKeyWithIV(重新解释强制转换(key.c_str()),
键。大小(),iv);
std::字符串ret;
CryptoPP::StringSource(msg,true,
新的CryptoPP::StreamTransformationFilter
(e,新加密PP::StringSink(ret),
CryptoPP::BlockPaddingSchemeDef::BlockPaddingScheme::ZEROS_PADDING));
返回ret;
}
我希望你没有花太多时间在这上面。这是几年前在邮件列表上被询问和回答的。是否有任何地方可以让mcrypt用户更容易使用它>