<?php
declare(strict_types=1);
/**
* @author Mehrez Labidi
*/
namespace App\Services\Encryptage;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
class AesEncrytageStrategy
{
/**
* @var ContainerBagInterface
*/
private $params;
/**
* @param ContainerBagInterface $params
*/
public function __construct(ContainerBagInterface $params)
{
$this->params = $params;
}
/**
* @param $toEncrypt
* @return string
*/
public function encryptage($toEncrypt)
{
if( $this->checkIfAlreadyCrypted($toEncrypt) ){ // deja crypté
return $toEncrypt;
}
$keyEncrypt = $this->params->get('encrypt.key');
$algoEncrypt = $this->params->get('encrypt.algo');
$func = $algoEncrypt;
$key = $func($keyEncrypt);
$key = $this->mysqlAesKey($key);
$padValue = 16 - (strlen($toEncrypt) % 16);
$param1 = 16 * (floor(strlen($toEncrypt) / 16) + 1);
$param1 = (int)$param1;
$toEncrypt = str_pad($toEncrypt, $param1,chr($padValue));
return strtoupper(bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $toEncrypt, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_DEV_URANDOM))));
}
/**
* @param $key
* @return string
*/
private function mysqlAesKey($key)
{
$new_key = str_repeat(chr(0), 16);
for ($i = 0, $len = strlen($key); $i < $len; ++$i) {
$new_key[$i % 16] = $new_key[$i % 16] ^ $key[$i];
}
return $new_key;
}
/**
* @param $toDecrypt
* @return string
*/
public function decryptage($toDecrypt)
{
if( !$this->checkIfAlreadyCrypted($toDecrypt) ){ // deja non crypté
return $toDecrypt;
}
$keyEncrypt = $this->params->get('encrypt.key');
$algoEncrypt = $this->params->get('encrypt.algo');
$func = $algoEncrypt;
$key = $func($keyEncrypt);
$toDecrypt = pack('H*', $toDecrypt);
$key = $this->mysqlAesKey($key);
return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $toDecrypt, MCRYPT_MODE_ECB, ''), "\x00..\x1F");
}
/**
* @param string|null $str
* @return bool
*/
private function checkIfAlreadyCrypted( ?string $str )
{ // strlen >= 16 + at least one capital letter + at least one number
if( (strlen($str)>=16) && (preg_match('/^[A-Z0-9]+$/', $str)) ){
return true;
}
return false;
}
}