【问题标题】:How to do AES256 decryption in PHP?如何在 PHP 中进行 AES256 解密?
【发布时间】:2010-12-10 07:58:32
【问题描述】:

我有一段加密的文本需要解密。它使用 AES-256-CBC 加密。我有加密的文本、密钥和 iv。但是,无论我尝试什么,我似乎都无法让它发挥作用。

互联网建议 mcrypt 的 Rijndael 密码应该能够做到这一点,所以这就是我现在所拥有的:

function decrypt_data($data, $iv, $key) {
    $cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

    // initialize encryption handle
    if (mcrypt_generic_init($cypher, $key, $iv) != -1) {
        // decrypt
        $decrypted = mdecrypt_generic($cypher, $data);

        // clean up
        mcrypt_generic_deinit($cypher);
        mcrypt_module_close($cypher);

        return $decrypted;
    }

    return false;
}

就目前而言,我收到 2 个警告,输出是乱码:

Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Key size too large; supplied length: 64, max: 32 in /var/www/includes/function.decrypt_data.php on line 8
Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Iv size incorrect; supplied length: 32, needed: 16 in /var/www/includes/function.decrypt_data.php on line 8

任何帮助将不胜感激。

【问题讨论】:

    标签: php aes mcrypt


    【解决方案1】:

    我对这些东西不是很熟悉,但似乎尝试用MCRYPT_RIJNDAEL_256 代替MCRYPT_RIJNDAEL_128 显然是下一步...

    编辑:你是对的——这不是你需要的。 MCRYPT_RIJNDAEL_128 实际上是正确的选择。根据您提供的链接,您的密钥和 IV 是应有的两倍:

    // How do you do 256-bit AES encryption in PHP vs. 128-bit AES encryption???
    // The answer is:  Give it a key that's 32 bytes long as opposed to 16 bytes long.
    // For example:
    $key256 = '12345678901234561234567890123456';
    $key128 = '1234567890123456';
    
    // Here's our 128-bit IV which is used for both 256-bit and 128-bit keys.
    $iv =  '1234567890123456';
    

    【讨论】:

    • 是的,我试过了。根据chilkatsoft.com/p/php_aes.asp,这是块大小,而不是密钥大小。
    • 好收获。您提供的链接回答了您的问题:您必须提供一个 32 字节的密钥和一个 16 字节的 IV。您传递的值是所需长度的两倍。
    • 原来是十六进制编码的,只需要通过pack('H*', $var)运行。
    • 对不起,听起来很愚蠢,但你到底是什么 pack() ?我自己一直在尝试这样做,但没有任何运气..
    • @NilsMunch 您使用 pack() 将十六进制表示转换为实际的二进制 128/256 位表示。
    【解决方案2】:

    我给你发一个例子, 请检查代码,好的

    $data_to_encrypt = "2~1~000024~0910~20130723092446~T~00002000~USD~F~375019001012120~0~0~00000000000~";
    $key128 = "abcdef0123456789abcdef0123456789";
    $iv = "0000000000000000";
    
    $cc = $data_to_encrypt;
    $key = $key128;
    $iv =  $iv;
    $length = strlen($cc);
    
    $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'','cbc','');
    
    mcrypt_generic_init($cipher, $key, $iv);
    $encrypted = base64_encode(mcrypt_generic($cipher,$cc));
    mcrypt_generic_deinit($cipher);
    
    mcrypt_generic_init($cipher, $key, $iv);
    $decrypted = mdecrypt_generic($cipher,base64_decode($encrypted));
    mcrypt_generic_deinit($cipher);
    
    echo "encrypted: " . $encrypted;
    echo "<br/>";
    echo "length:".strlen($encrypted);
    echo "<br/>";
    echo "decrypted: " . substr($decrypted, 0, $length);
    

    【讨论】:

    • 为我工作!我唯一的建议是使用 rtrim 而不是 substr 来解密文本,因为您可能并不总是知道长度。 rtrim($decrypted, "\0")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2012-04-09
    • 2021-10-27
    相关资源
    最近更新 更多