Je suis en train de chiffrer et déchiffrer une communication entre une bibliothèque C++ et un serveur PHP en utilisant bibliothèque OpenSSL dans les deux d'entre eux. Je veux utiliser l'algorithme Blowfish CBC mais il semble que les résultats soient différents entre le code C++ et le code PHP. Le code C++ est pris d'ici:cryptage Blowfish OPENSSL CBC diffère de PHP en C++
Voici le code PHP:
<?php
function strtohex($x)
{
$s='';
foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));
return($s);
}
$encryptedMessage = openssl_encrypt("input", "BF-CBC", "123456", 0, "initvect");
echo $encryptedMessage;
echo "\n";
echo strtohex($encryptedMessage);
La sortie de PHP est la suivante:
x9jDa2WMwvQ=
78396A446132574D7776513D
C'est le C++ code:
bool do_encrypt(const char *in, unsigned char *out, int *outlen, unsigned char *key, unsigned char *iv)
{
int buflen, tmplen;
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_bf_cbc(), nullptr, key, iv);
if (!EVP_EncryptUpdate(&ctx, out, &buflen, (unsigned char*)in, strlen(in)))
{
return false;
}
if (!EVP_EncryptFinal_ex(&ctx, out + buflen, &tmplen))
{
return false;
}
buflen += tmplen;
*outlen = buflen;
EVP_CIPHER_CTX_cleanup(&ctx);
return true;
}
unsigned char output[2048] = { 0 };
int outLen;
auto result = do_encrypt("input", output, &outLen, (unsigned char*)"123456", (unsigned char*)"initvect");
BIGNUM *outputStr = BN_new();
BN_bin2bn(output, outLen, outputStr);
cout << base64_encode(output, outLen) << "\n";
cout << BN_bn2hex(outputStr) << "\n";
La sortie C de est la suivante:
EfRhhWqGmSQ=
11F461856A869924
Quelqu'un peut-il me s'il vous plaît aider à comprendre ce que je fais mal? Toute aide sera très appréciée.
Merci!
Edit 1: j'ai réussi à fixer le code C++ après réponse JWW et il a bien fonctionné. Je manquais le EVP_CIPHER_CTX_set_key_length Cependant, je ne pouvais pas faire le code PHP retourne la même chose et, finalement, nous avons décidé de passer à AES et il fonctionne maintenant parfaitement. Merci!
Vous pouvez avoir un aperçu rapide [vice-président exécutif Symmetric Chiffrage et déchiffrage] (http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption) sur le wiki OpenSSL.En fait, vous devriez probablement utiliser un chiffrement authentifié, car il fournit * la * confidentialité et l'authenticité. Voir [Chiffrement et décryptage authentifiés par EVP] (http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption) sur le wiki OpenSSL. – jww
Merci pour la suggestion. Je vais regarder dedans. Mais pour l'instant, il n'est pas facile de changer le point de terminaison PHP pour utiliser un cryptage différent. – saw66
Blowfish n'est plus considéré comme sûr, même son inventeur utilise maintenant AES. – zaph