簡體   English   中英

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;
}

但它們不會返回相同的加密文本。 我希望更改 C++ 代碼以使其等效於 PHP 代碼,而不是相反。

對於以下鍵和消息:

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

PHP 代碼返回一個 24 字節的密文(base64 編碼為):

a78URfI6EV8m3sTaDDDrntI8VbjWHiwm

但 C++ 返回 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM