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.
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