OpenSSL 加密/解密 php.



我正在做加密,效果很好,但用同样的方法我正在解密,我得到空白字符串没有得到解密字符串。我正在使用方法AES-256-ECB,密钥是十六进制的,所以我传递为

$key = pack('H*','xxxx

加密正确,但解密不起作用。请帮助我做错了什么。

function encrypt(string $data, string $key, string $method): string
{
$ivSize = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($ivSize);
$encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
$encrypted = strtoupper(implode(null, unpack('H*', $encrypted)));
return $encrypted;
}
function decrypt(string $data, string $key, string $method): string
{
$data = pack('H*', $data);
$ivSize = openssl_cipher_iv_length($method);  
$iv = $iv = openssl_random_pseudo_bytes($ivSize);
$decrypted = openssl_decrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv); 
return trim($decrypted);
}

您的函数使用以下代码非常适合我:

$key = pack('H*','aaaaaaaaaaaaa');
$method = 'aes-256-ecb';
$encrypted = encrypt('test string', $key, $method);
$decrypted = decrypt($encrypted, $key.'a', $method);
echo $decrypted; // Output: 'test string'

由于您获得的是一个用于解密的空字符串,这意味着您在解密时获得了错误的密钥或密文。确保您用于解密的密钥与用于加密的密钥完全相同,包括对其进行的任何操作,例如您在此处执行的pack()函数。即使相差一个字节,你也无法解密。

还要确保密钥和密文在存储时都不会被截断。如果使用数据库并且列类型对于您尝试存储的内容来说太小,它将截断值。

最新更新