Implementacja AES 128 w PHP

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));
    }