Question

Je suis en train d'effectuer le chiffrement et le déchiffrement (Rijndael 256, mode ECB) en deux composantes différentes:
1. PHP - côté serveur (en utilisant mcrypt)
2. C + + - côté client (à l'aide de gcrypt)

je suis tombé sur un problème lorsque le côté client n'a pas pu déchiffrer correctement les données cryptées (faite par le côté serveur)
alors ... J'ai vérifié le:
1. vecteur initial - même identiques (32 longueur)
2. la clé - encore une fois la même touche sur les deux côtés ..

j'ai donc écrit un code en C ++ qui crypter les données (avec les mêmes paramètres comme dans le php)
et j'ai découvert que les données chiffrées contient différents octets (codant pour peut-être question ??)

Je serai plus heureux d'obtenir de l'aide

PHP - MCrypt


// Encrypt Function
function mc_encrypt($encrypt, $mc_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $iv = "static_init_vector_static_init_v";
    echo "IV-Size: " . $iv_size . "\n";
    echo "IV: " . $iv . "\n";
    $passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, $encrypt, MCRYPT_MODE_ECB, $iv);
    print_hex($passcrypt);
    return $encode;
}

mc_encrypt("Some text which should be encrypted...","keykeykeykeykeykeykeykeykeykeyke");

Je vais poster le code C ++ dans un commentaire

Merci, Johnny Depp

Était-ce utile?

La solution

OK. Je vais faire mes commentaires une réponse:

Un vecteur d'initialisation (IV) n'est pas utilisé en mode ECB. S'il est prévu différentes implémentations peuvent fonctionner différemment.

Si vous voulez être sûr que les implémentations fonctionner correctement alors utiliser un IV de 0 (zéro). Même si vous fournissez le IV, les deux implémentations devraient ignorer, mais on ne peut jamais être sûr. Ne pas fournir un IV en mode de la BCE devrait fonctionner aswell mais encore une fois, tout dépend de la mise en oeuvre.

Selon la documentation PHP MCrypt sera l'ignorer. GCrypt Je ne suis pas sûr.

mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) devrait revenir effectivement 0 puisque vous spécifiez le mode ECB.

Modifier

Ne pas appeler mcrypt_get_iv_size ou mcrypt_create_iv.
appeler au lieu mcrypt_encrypt sans IV. Selon la documentation PHP tous les octets de la IV seront mis à '\ 0'.

la même chose pour le code du C. Pas besoin de spécifier les paramètres IV du tout. Le code libgcrypt est complexe, mais en regardant de la source de la version 1.4.5 alors en mode ECB, il semble que le IV ne sert pas du tout.

Si le cryptogramme résultant diffère encore alors le problème est autre chose.
Deux possibilités vient à l'esprit:

  • L'encodage - est le même encodage utilisé dans le serveur et le client
  • Endianness - Quel type de systèmes sont le serveur et le client? Big- vs Little-endian?
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top