OpenSSL加密/解密php

时间:2018-06-26 06:00:57

标签: php encryption openssl php-7.2

我正在执行加密,效果很好,但是使用相同的方法进行解密,但是我得到的是空白字符串而不是解密字符串。我正在使用方法 AES-256-ECB ,并且密钥是十六进制的,所以我通过了

  

$ key = pack('H *','xxxxxxxxxxxx');

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

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);
}

1 个答案:

答案 0 :(得分:1)

使用以下代码,您的函数对我而言工作完美:

$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()函数。即使只有一个字节的差异,您也将无法解密。

还要确保密钥和密文在存储时都没有被截断。如果使用数据库并且列类型对于要存储的内容而言太小,则会截断值。

相关问题