Implementacja AES 128 w PHP
Ostatnimi czasy przyszło mi powalczyć z implementacją kodowania AES 128 w PHP. Oczywiście Google – pierwszy przyjaciel programisty – naprowadził mnie na rozwiązania typu phpAES czy 28 trafionych klas na www.phpclasses.org .
Oczywiście nie wierzę specjalnie w pisanie funkcji kodujących w czystym PHP (wolę binarki) – z pomocą przyszedł opisywany wcześniej MCrypt 🙂
Niestety nie jest to takie “oczywiste” – bo AES 128 znany jest również jako Rijndael . Dlatego też bardzo szczęśliwie znalazłem działający poprawnie przykład:
[
function aes_decrypt($value, $key){
if(empty($value) || empty($key)){ return FALSE;}
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $value, MCRYPT_MODE_ECB, $iv);
return $decrypttext;
}
druga funkcja jest odrobinę inaczej skonstruowana, ale jest za to kompatybilna z MySQL AES
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));
}