【问题标题】:From mcrypt_decrypt to openssl_decrypt从 mcrypt_decrypt 到 openssl_decrypt
【发布时间】:2017-10-19 19:42:45
【问题描述】:

我有一个问题,我想用 open_ssl 解密替换对 mcrypt 的函数调用。但输出是混合的:

这是 mcrypt 实现(效果很好):

$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,
                         substr(sha1($this->secretKey), 0, 32),
                         base64_decode($encrypted),
                         MCRYPT_MODE_CBC,
                         base64_decode($iv)), "\0..\32");
                         var_dump($decrypted);

我把它翻译成:

        var_dump( 
        trim(
            openssl_decrypt(
                $encrypted,
                'AES-256-CBC',
                substr(sha1($this->secretKey), 0, 32), 
                OPENSSL_ZERO_PADDING, $iv) 
            ),"\0..\32");

,

但是会导致错误:

openssl_decrypt(): IV 传递的长度是 24 字节,比 所选密码预期为 16,正在截断

和混合输出:

'm%xlj j>|lgSke":"2017-05-19T05:48:37-07:00","收据":

第一个被混合的键值对。

任何我可能错过的建议或任何选项?

谢谢!

【问题讨论】:

标签: php openssl mcrypt php-openssl


【解决方案1】:

$data 可以是描述中所说的 raw 或 base64。如果没有设置$option(也就是说,如果在此参数中传递值 0),则数据将被假定为 base64 编码。如果设置了参数OPENSSL_RAW_DATA,会被理解为行数据。

$iv$password 一样,是一个字节串。它的长度取决于所使用的算法。生成$iv 的最佳方式可能是:

$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('your algorithm'));
// for example you algorithm = 'AES-256-CTR'

欲了解更多信息:https://www.php.net/manual/en/function.openssl-decrypt.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2017-09-18
    • 2013-10-23
    相关资源
    最近更新 更多