[RESOLU] Probleme avec l'encryption encryption AES ...

Eléphanteau du PHP | 19 Messages

12 nov. 2015, 08:58

Bonjour

Voilà, j'ai un probleme dont cela fait des heures que j'essaye en vain de résoudre.... :(

j'ai un petit programme qui crypte "hello world" en "9F3B0437A62248E9A1D914201532C9A9" avec la clé "1111222233334444".
Il s'agit de l'algorythme de cryptage AES 128 bit, et le mode ECB.

Apres des heures de recherches, j'ai reussi à trouver un script PHP qui donne le meme resultat :
<?php
$password = "1111222233334444"; //MUST be 16 characters
$text = "hello world";
 
function aes_encrypt($val,$ky) {
    $mode=MCRYPT_MODE_ECB;    
    $enc=MCRYPT_RIJNDAEL_128;
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
    return mcrypt_encrypt($enc, $ky, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
}
 
echo strtoupper(bin2hex(aes_encrypt($text,$password)));
?>
La personne qui l'a posté (il y a des années..) a ajouté : "Basically what has to happen, is the returned encryption must be padded out, then turned to uppercase hex. Then it'll work like a charm in AES Fusion..."

Cependant j'ai besoin d'un script qui me permet de faire l'inverse, c'est à dire, à partir du mot crypté "9F3B0437A62248E9A1D914201532C9A9" et de la clé "1111222233334444" me permettent d'obtenir "hello world"...

Apparement ce script provient du script suivant :
function aes_decrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode = MCRYPT_MODE_ECB; 
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND) ); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
} 
 
function aes_encrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode=MCRYPT_MODE_ECB; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_RAND)); 
}
avec $val pour le texte, et $ky pour la clé...

j'ai donc essayé ce script ( et une rimbanbelle d'autres...) :
<?php 
$ky ="1111222233334444";
$val ="9F3B0437A62248E9A1D914201532C9A9";
function mysql_aes_decrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode = MCRYPT_MODE_ECB; 
    $enc = MCRYPT_RIJNDAEL_128; 
    $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM ) ); 
    return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null)); 
} 
 
function mysql_aes_encrypt($val,$ky) 
{ 
    $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 
    for($a=0;$a<strlen($ky);$a++) 
      $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a])); 
    $mode=MCRYPT_MODE_ECB; 
    $enc=MCRYPT_RIJNDAEL_128; 
    $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16))); 
    return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM)); 
} 
echo mysql_aes_decrypt($val,$ky);
?>

Or, lorsque j'essaye de decrypter "9F3B0437A62248E9A1D914201532C9A9", je n'obtiens jamais "hello world"... mais "D•Ã*€BË>vóÜBäô‚vZŠáNJ}fšæÚ+ñ"......

Quelqu'un serait-il d'ou viens mon erreur?
Merci pour votre aide

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

12 nov. 2015, 11:28

Bonjour,

C'est tout bête en fait ;)
Après ton encodage, tu fais une conversion en hexadécimal avec la fonction bin2hex()

Donc pour le décodage, il faut d'abord que tu fasses l'opération inverse avec la fonction hex2bin()


Voila ce que ça donnerait :
<?php
header('Content-Type: text/html; charset=utf-8');

$text = "hello world";

$key = "1111222233334444"; //MUST be 16 characters
$mode=MCRYPT_MODE_ECB;    
$enc=MCRYPT_RIJNDAEL_128;
 
function aes_encrypt($val,$key) {
	global $mode, $enc;
	$val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
	$val_enc=mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
	return strtoupper(bin2hex($val_enc));
}

function aes_decrypt($val,$key) {
	global $mode, $enc;
	$val=hex2bin($val);
	return mcrypt_decrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM) ); 
}



$val_enc=aes_encrypt($text,$key);
echo $val_enc."<hr />";
echo aes_decrypt($val_enc,$key);
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 19 Messages

12 nov. 2015, 16:52

Arthur Merciiiiiiii! c'est magnifique! Vous m'enlevez une de ces epines du pied! :)