【问题标题】:My AES function encrypts value correctly, but decrypting returns FALSE我的 AES 函数正确加密值,但解密返回 FALSE
【发布时间】:2020-12-13 10:14:26
【问题描述】:

我的 AES 加密类有问题。这里是:

<?php
require_once 'SecretData.php';

class AESEncryption
{
    private static $AES_METHOD = 'aes-256-cbc';

    public static function encrypt($data, $key = null)
    {
        if($key == null)
        {
            $secretData = new SecretData();
            $key = $secretData->universalAESKey;
        }

        $ivSize = openssl_cipher_iv_length(self::$AES_METHOD);
        $iv = openssl_random_pseudo_bytes($ivSize);

        $encryptedData = openssl_encrypt($data, self::$AES_METHOD, $key, OPENSSL_RAW_DATA, $iv);
        return base64_encode($iv . $encryptedData);
    }

    public static function decrypt($data, $key = null)
    {
        $data = base64_decode($data);

        if($key == null)
        {
            $secretData = new SecretData();
            $key = $secretData->universalAESKey;
        }

        $ivSize = openssl_cipher_iv_length(self::$AES_METHOD);
        $iv = mb_substr($data, 0, $ivSize, '8bit');
        $decryptedData = mb_substr($data, $ivSize, null, '8bit');

        return openssl_decrypt($decryptedData, self::$AES_METHOD, $key, OPENSSL_RAW_DATA, $iv);
    }
}

我的登录类中有问题,我发现这个函数是错误的原因。我做了以下调试文件:

<?php
require_once '/var/www/backend/security/HashingAlgorithms.php';
require_once '/var/www/backend/security/AESEncryption.php';

$data = 'alpha';

$enc = AESEncryption::encrypt($data);
$dec = AESEncryption::decrypt($enc);

echo 'Input: ' . $data . ' <> Encrypted: ' . $enc . ' <> Decrypted: ' . $dec;
var_dump($dec);

这是一个输出:

Input: alpha <> Encrypted: 7hB1hNiSYvU+Hy4xgvHb2sf/cVa2NPkx4+3kX+qdvUM= <> Decrypted: bool(false) 

当我查看代码时,一切看起来都很好:

  • 我从 SecretData 函数中获取密钥(密钥 100% 正确),
  • 获取 IV 长度并生成它,
  • OpenSSL 加密数据,我使用 base64 存储 IV 和加密值。

与解密功能相同:

  • 从 base64 解码,
  • 获取 IV 长度并将 base64 解码数据划分为 IV 本身和加密数据
  • OpenSSL 解密数据并返回值。

谁能看看这个,告诉我哪里错了

【问题讨论】:

标签: php encryption aes


【解决方案1】:

如果没有看到SecretData.php 文件,我无法将您引导至特定的故障点。但是,我可以自己创建一个假人来确认代码本身是否正常工作。

代码

<?php

class SecretData
{
    public $universalAESKey = '79f0f1a2e72b6654bba3071ff8210c13';
}

class AESEncryption
{
    private static $AES_METHOD = 'aes-256-cbc';

    public static function encrypt($data, $key = null)
    {
        if($key == null)
        {
            $secretData = new SecretData();
            $key = $secretData->universalAESKey;
        }

        $ivSize = openssl_cipher_iv_length(self::$AES_METHOD);
        $iv = openssl_random_pseudo_bytes($ivSize);

        $encryptedData = openssl_encrypt($data, self::$AES_METHOD, $key, OPENSSL_RAW_DATA, $iv);
        return base64_encode($iv . $encryptedData);
    }

    public static function decrypt($data, $key = null)
    {
        $data = base64_decode($data);

        if($key == null)
        {
            $secretData = new SecretData();
            $key = $secretData->universalAESKey;
        }

        $ivSize = openssl_cipher_iv_length(self::$AES_METHOD);
        $iv = mb_substr($data, 0, $ivSize, '8bit');
        $decryptedData = mb_substr($data, $ivSize, null, '8bit');

        return openssl_decrypt($decryptedData, self::$AES_METHOD, $key, OPENSSL_RAW_DATA, $iv);
    }
}

测试

$data = 'alpha';

$enc = AESEncryption::encrypt($data);
$dec = AESEncryption::decrypt($enc);

echo 'INPUT:' . $data . PHP_EOL;
echo 'ENCRP:' . $enc . PHP_EOL;
echo 'DECRP:' . $dec . PHP_EOL;

$enc = AESEncryption::encrypt($data, "e2e0cc36ea14bc5cd94473facd4731a6");
$dec = AESEncryption::decrypt($enc, "e2e0cc36ea14bc5cd94473facd4731a6");

echo 'INPUT:' . $data . PHP_EOL;
echo 'ENCRP:' . $enc . PHP_EOL;
echo 'DECRP:' . $dec . PHP_EOL;

结果

INPUT:alpha
ENCRP:PUn1xaDRMX4U0K4NVnJiRv4mtROpn3WvcFnSrR9EJ98=
DECRP:alpha

INPUT:alpha
ENCRP:QOs1vvy/6aKRSVGmZQWp7EvSNoISCpJ4Vsy3T3ixXZ4=
DECRP:alpha

【讨论】:

  • 那么...为什么我的代码不起作用?那一个与上面列出的我的相同,并且在复制和粘贴您的代码后一切正常......(我使用了我原来的 SecretData.php)
  • 如果不查看应用程序的其余部分、设置等,很难判断。猜测您的应用程序中的某处没有缓存,您的代码中的某处可能存在一些小问题。老实说,我不能说太多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 2012-03-12
相关资源
最近更新 更多