Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加密++;相当于PHP mcrypt_encrypt mcrypt_3DES/mcrypt_MODE_CBC_Php_C++_Crypto++_3des - Fatal编程技术网

加密++;相当于PHP mcrypt_encrypt mcrypt_3DES/mcrypt_MODE_CBC

加密++;相当于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

我使用以下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 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用户更容易使用它>