J'écris un script de gestionnaire d'erreurs qui crypte les données d'erreur (fichier, ligne, erreur, message, etc.) et passe le tableau sérialisé en tant que variable POST (en utilisant curl) pour un script qui enregistre ensuite l'erreur dans un db central.L'utilisation de mcrypt pour transmettre des données sur un service Web échoue
J'ai testé mon Crypter/décrypter les fonctions dans un seul fichier et les données sont chiffrées et déchiffrées fin:
define('KEY', 'abc');
define('CYPHER', 'blowfish');
define('MODE', 'cfb');
function encrypt($data) {
$td = mcrypt_module_open(CYPHER, '', MODE, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, KEY, $iv);
$crypttext = mcrypt_generic($td, $data);
mcrypt_generic_deinit($td);
return $iv.$crypttext;
}
function decrypt($data) {
$td = mcrypt_module_open(CYPHER, '', MODE, '');
$ivsize = mcrypt_enc_get_iv_size($td);
$iv = substr($data, 0, $ivsize);
$data = substr($data, $ivsize);
if ($iv)
{
mcrypt_generic_init($td, KEY, $iv);
$data = mdecrypt_generic($td, $data);
}
return $data;
}
echo "<pre>";
$data = md5('');
echo "Data: $data\n";
$e = encrypt($data);
echo "Encrypted: $e\n";
$d = decrypt($e);
echo "Decrypted: $d\n";
Sortie:
Data: d41d8cd98f00b204e9800998ecf8427e
Encrypted: ê÷#¯KžViiÖŠŒÆÜ,ÑFÕUW£´Œt?†÷>c×åóéè+„N
Decrypted: d41d8cd98f00b204e9800998ecf8427e
Le problème est, quand je mettre la fonction de cryptage dans mon fichier de transmission (tx.php) et le décryptage dans mon fichier de réception (rx.php), les données ne sont pas entièrement décryptées (les deux fichiers ont le même ensemble de constantes pour la clé, le chiffrement et le mode).
Data before passing: a:4:{s:3:"err";i:1024;s:3:"msg";s:4:"Oops";s:4:"file";s:46:"/Applications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;}
Data decrypted: Mª4:{s:3:"err";i:[email protected]ªç`^;g";s:4:"Oops";s:4:"file";sôÔ8F•Ópplications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;}
Notez les caractères aléatoires au milieu.
Mon boucle est assez simple:
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
choses que je soupçonne pourrait être la cause:
- encodage de la demande boucle
- quelque chose à voir avec un rembourrage mcrypt manquant octets
- Je l'ai regardé trop longtemps et j'ai raté quelque chose de vraiment évident
Si j'éteins les fonctions crypt (le transfert tx-> rx n'est pas crypté), les données sont reçues correctement.
Tout aide tous très apprécié!
Merci, Adam
Merci pour la suggestion, mais j'ai ajouté cela et ce n'est pas résolu le problème. –