64 lines
1.8 KiB
PHP
64 lines
1.8 KiB
PHP
<?php
|
|
namespace fox;
|
|
|
|
/**
|
|
*
|
|
* Class fox\xcrypt
|
|
*
|
|
* @copyright MX STAR LLC 2021
|
|
* @version 4.0.0
|
|
* @author Pavel Dmitriev
|
|
* @license GPLv3
|
|
*
|
|
*/
|
|
class xcrypt
|
|
{
|
|
|
|
static function encrypt($val, $key = null)
|
|
{
|
|
if (isset($key)) {
|
|
$ENC_KEY = substr(md5($key), 0, 24);
|
|
} else {
|
|
$ENC_KEY = substr(md5(config::get("masterSecret")), 0, 24);
|
|
}
|
|
$ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
|
|
$iv = openssl_random_pseudo_bytes($ivlen);
|
|
$ciphertext_raw = openssl_encrypt($val, $cipher, $ENC_KEY, OPENSSL_RAW_DATA, $iv);
|
|
$hmac = hash_hmac('sha256', $ciphertext_raw, $ENC_KEY, true);
|
|
$ciphertext = base64_encode($iv . $hmac . $ciphertext_raw);
|
|
return $ciphertext;
|
|
}
|
|
|
|
static function decrypt($val, $key = null)
|
|
{
|
|
if (isset($key)) {
|
|
$ENC_KEY = substr(md5($key), 0, 24);
|
|
} else {
|
|
$ENC_KEY = substr(md5(config::get("masterSecret")), 0, 24);
|
|
}
|
|
|
|
$c = base64_decode($val);
|
|
$ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
|
|
$iv = substr($c, 0, $ivlen);
|
|
$hmac = substr($c, $ivlen, $sha2len = 32);
|
|
$ciphertext_raw = substr($c, $ivlen + $sha2len);
|
|
$plaintext = openssl_decrypt($ciphertext_raw, $cipher, $ENC_KEY, OPENSSL_RAW_DATA, $iv);
|
|
$calcmac = hash_hmac('sha256', $ciphertext_raw, $ENC_KEY, true);
|
|
if ($hmac && hash_equals($hmac, $calcmac)) {
|
|
return $plaintext;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
static function hash($val, $key = null)
|
|
{
|
|
if (isset($key)) {
|
|
$ENC_KEY = substr(md5($key), 0, 24);
|
|
} else {
|
|
$ENC_KEY = substr(md5(config::get("masterSecret")), 0, 24);
|
|
}
|
|
|
|
return hash_hmac('sha256', $val, $ENC_KEY, false);
|
|
}
|
|
} |