MCrypt vs OpenSSL

Comparación entre la biblioteca PHP de cifrado MCrypt (obsoleto en PHP 7) y el sistema de cifrado OpenSSL.

En la versión PHP 7 ya no apoya MCrypt para tareas de cifrado debido a que esta biblioteca se considera abandonoware. La biblioteca de cifrado OpenSSL es la que se recomienda usar.

Comparación entre las clases

Las dos clases son equivalentes entre sí: Se puede tomar la codificación que da una de las clases para decodificarla con la otra clase

Clase CypherMCrypt PHP 5

class CypherMCrypt {

  private static $algorithm = MCRYPT_RIJNDAEL_128; 
  private static $mode = MCRYPT_MODE_CBC;

  public static function encode($text) {
    $iv = self::getIV();
    $encrypted = mcrypt_encrypt(self::$algorithm, self::getKey(), self::addPadding($text), self::$mode, $iv);
    $binary = $iv.$encrypted;
    return base64_encode($binary);
  }

  public static function decode($text) {
    $binary = base64_decode($text);
    $size = self::getSize();
    $iv = substr($binary, 0, $size);
    $encrypted = substr($binary, $size);
    $text = mcrypt_decrypt(self::$algorithm, self::getKey(), $encrypted, self::$mode, $iv);
    return self::stripPadding($text);
  }

  private static function getKey() { 
    return pack('H*', "0123456789abcdef00112233445566778899aabbccddeeff0123456789abcdef");
  }
  private static function getIV() {    
    return mcrypt_create_iv(self::getSize(), MCRYPT_DEV_URANDOM);
  }
  private static function getSize() {
    return mcrypt_get_iv_size(self::$algorithm, self::$mode);
  }

  private static function addPadding($string) {
    $blocksize = self::getSize();
    $len = strlen($string);
    $pad = $blocksize - ($len % $blocksize);
    $string .= str_repeat(chr($pad), $pad);
    return $string;
  }
  private static function stripPadding($string) {
    $slast = ord(substr($string, -1));
    $slastc = chr($slast);
    $pcheck = substr($string, -$slast);
    if (preg_match("/$slastc{".$slast."}/", $string)) {
      $string = substr($string, 0, strlen($string)-$slast);
      return $string;
    }
    else return false;
  }

}

Clase CypherOpenSSL PHP 7

class CypherOpenSSL {
    
  private static $algorithm = "AES-256-CBC"; 
  private static $options = OPENSSL_RAW_DATA;

  public static function encode($text) {
    $iv = self::getIV();
    $encrypted = openssl_encrypt($text, self::$algorithm, self::getKey(), self::$options, $iv);
    $binary = $iv.$encrypted;
    return base64_encode($binary);
  }

  public static function decode($text) {
    $binary = base64_decode($text);
    $size = self::getSize();
    $iv = substr($binary, 0, $size);
    $encrypted = substr($binary, $size);
    $text = openssl_decrypt($encrypted, self::$algorithm, self::getKey(), self::$options, $iv);
    return $text;
  }

  private static function getKey() { 
    return pack('H*', "0123456789abcdef00112233445566778899aabbccddeeff0123456789abcdef");
  }
  private static function getIV() {    
    return openssl_random_pseudo_bytes(self::getSize());
  }
  private static function getSize() {
    return openssl_cipher_iv_length(self::$algorithm);
  }

}

Descarga

cypher.php.7z

Comentarios

Proinf.net, ©2003-2018 ci 3.1.9 (CC) Esta obra está bajo una licencia de Creative Commons Este software está sujeto a la CC-GNU GPL