PHP : UTF8 et Crypt

Résolu/Fermé
liloo35 Messages postés 3 Date d'inscription mercredi 30 mai 2012 Statut Membre Dernière intervention 30 mai 2012 - 30 mai 2012 à 11:27
liloo35 Messages postés 3 Date d'inscription mercredi 30 mai 2012 Statut Membre Dernière intervention 30 mai 2012 - 30 mai 2012 à 14:50
Bonjour,

J'ai un problème d'encodage avec la fonction Crypt de PHP.

Ma base de données est en utf8-general-ci
Toutes mes pages web sont en utf8

Je n'ai aucun problème avec tous mes champs sauf ceux qui sont cryptés.

Pour préparer mes requêtes j'ai :
$query = $pdoConnexion->prepare("SET NAMES UTF8");
$query->execute();


Mes fonctions de cryptage sont :

/**
 *
 * Fonction pour crypter des données à partir d'une clé
 * @param $strToCrypt
 */
function GetEncrypted($strToEncrypted) {
	/* Charge un chiffrement */
	$td = mcrypt_module_open('tripledes', '', MCRYPT_MODE_ECB, '');

	/* Crée le VI et détermine la taille de la clé */
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	$ks = mcrypt_enc_get_key_size($td);

	/* Crée la clé */
	$key = substr(md5($_SESSION["SECURE"]["CLE"]), 0, $ks);

	/* Intialise le chiffrement */
	mcrypt_generic_init($td, $key, $iv);

	/* Chiffre les données */
	$encrypted = mcrypt_generic($td, $strToEncrypted);

	/* Libère le gestionnaire de chiffrement, et ferme le module */
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	
	return $encrypted;
	
}

/**
 * 
 * Fonction pour décrypter les données à partir d'une clé
 * @param $strToEncrypted
 */
function GetDecrypted ($strToDecrypted) {
	
	/* Charge un chiffrement */
	$td = mcrypt_module_open('tripledes', '', MCRYPT_MODE_ECB, '');

	/* Crée le VI et détermine la taille de la clé */
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
	$ks = mcrypt_enc_get_key_size($td);

	/* Crée la clé */
	$key = substr(md5($_SESSION["SECURE"]["CLE"]), 0, $ks);
	
	/* Initialise le module de chiffrement pour le déchiffrement */
	mcrypt_generic_init($td, $key, $iv);

	/* Déchiffre les données */
	$decrypted = mdecrypt_generic($td, $strToDecrypted);

	/* Libère le gestionnaire de déchiffrement, et ferme le module */
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);

	/* Affiche la chaîne */
	return trim($decrypted);
	
}



Je ne comprends pourquoi je n'arrive pas à afficher correctement les champs cryptés puis décryptés. Si j'enlève le SET NAMES UTF8 cela fonctionne parfaitement (mais j'en ai besoin pour tous les autres champs ...).

Merci par avance de votre aide.


A voir également:

4 réponses

Utilisateur anonyme
30 mai 2012 à 14:00
Je viens de comprendre.
Je suppose que tu enregistres ta donnée cryptée dans un champ texte en UTF8.
Mais le code qui sort du cryptage n'est PAS de l'UTF8, il ne peut pas être enregistré en UTF8.
En essayant de reproduire ton problème et en affichant le code d'erreur de PDO lors de l'insertion, j'ai eu le message :
Array ( [0] => HY000 [1] => 1366 [2] => Incorrect string value: '\xCAk\xEB\xC6D\x87...' for column '...
Ce qui confirme bien ce que je dis.

Le plus simple est de changer le type du champ en BLOB pour qu'il accepte n'importe quelle donnée binaire.
Ça marcherait dans doute aussi en changeant aussi l'encodage du champ (mais rien que de ce champ) en iso-8859 n'importe quoi, puisque toutes les chaînes sont valides avec ces encodages.
1
liloo35 Messages postés 3 Date d'inscription mercredi 30 mai 2012 Statut Membre Dernière intervention 30 mai 2012
30 mai 2012 à 12:26
J'ai essayer de le mettre dans l'initialisation mais cela ne fonctionne toujours pas :(

Mon initialisation avant modification était :

$pdoConnexion = new PDO("".__TYPE.":host=".__HOST.";port=".__PORT.";dbname=".__SID."",__USER,__PASSWORD);
$query = $pdoConnexion->prepare("SET NAMES UTF8");
$query->execute();
return $pdoConnexion;


Et après :

$pdoConnexion = new PDO("".__TYPE.":host=".__HOST.";port=".__PORT.";dbname=".__SID."",__USER,__PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));


Merci de ton aide.
0
liloo35 Messages postés 3 Date d'inscription mercredi 30 mai 2012 Statut Membre Dernière intervention 30 mai 2012
30 mai 2012 à 14:50
MERCI BEAUCOUP !!

J'ai modifié le type de mes champs concernés par le cryptage en BLOB et cela fonctionne à merveille.

Encore un grand merci !
0
Utilisateur anonyme
30 mai 2012 à 12:05
Bonjour

Pour utiliser UTF8 avec PDO, je crois que ça ne marche pas d'utiliser SET NAMES UTF8 dans une requête indépendante. Il faut l'inclure dans l'initialisation :
$pdoConnexion= new PDO(
    'mysql:host=hostname;dbname=defaultDbName',
    'username',
    'password',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
-1