<?php
class Crypto{

  private $cifra = 'AES-128-CBC';
  private $key = GLOBAL_KEY_CRYPTO;
  private $IV;

  private $texto_real;
  private $texto_crypto;

  public function __construct(){}

  // Criptografa o texto
  public function encode($texto, $key=false){
    $key = $key ? $key : $this->key;

    // Gera IV
    $this->IV = random_bytes(16);
    // Realiza a criptografia e converte em base64
    $this->texto_crypto = base64_encode($this->IV . openssl_encrypt($texto, $this->cifra, $key, OPENSSL_RAW_DATA, $this->IV));
    return $this->texto_crypto;
  }

  // Descriptografa a Hash
  public function decode($base64, $key=false){
    $key = $key ? $key : $this->key;

    // Decodifica base64
    $hash = base64_decode($base64);
    // Separa hash em IV e Texto
    $this->IV = mb_substr($hash, 0, 16, '8bit');
    $this->texto_crypto = mb_substr($hash, 16, null, '8bit');
    // Realiza a descriptografia do texto
    $this->texto_real = @openssl_decrypt($this->texto_crypto, $this->cifra, $key, OPENSSL_RAW_DATA, $this->IV);
    return $this->texto_real;
  }

}