2016-10-10 1 views
1

je le code PHP suivant pour chiffrer un texte en utilisant une clé:Crypto de l'équivalent de PHP mcrypt_encrypt MCRYPT_3DES/MCRYPT_MODE_CBC

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

Et ma fonction C++ correspondant, en utilisant Crypto ++ est:

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

Mais ils ne renvoient pas le même texte crypté. Je veux changer le code C++ pour qu'il soit équivalent au code PHP, et non le contraire.

Pour la clé suivante et un message:

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

Le code PHP renvoie un cryptogramme de 24 octets (base64 comme):

a78URfI6EV8m3sTaDDDrntI8VbjWHiwm 

Mais C++ renvoie un cryptogramme de 32 octets, mais avec un préfixe correspondant de 24 octets (base64 as):

a78URfI6EV8m3sTaDDDrntI8VbjWHiwm9M15+pzUnuM= 

donc, il y a une byt supplémentaire es dans la version C++ dont je ne sais pas d'où viennent-ils. Je pense qu'il peut être lié au schéma de remplissage, mais je ne connais pas le schéma de remplissage utilisé par PHP.

Répondre

1

Effectivement, c'était le rembourrage. La fonction PHP mcrypt_crypto applique un zéro-padding, donc, je ne spécifier à cryptopp que je veux appliquer un zéro padding au chiffrement:

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

J'espère que vous ne l'avez pas passer trop de temps là-dessus. Il a été demandé et répondu il y a quelques années à [Crypto ++ et mcrypt] (http://groups.google.com/forum/#!topic/cryptopp-users/Jpv4sm-547o) sur la liste de diffusion. Y at-il un endroit où nous pouvons le mettre pour le rendre plus facile sur les utilisateurs mcrypt> – jww