【问题标题】:PHP-AES-256-ECB decrypt messy codePHP-AES-256-ECB 解密乱码
【发布时间】:2016-05-11 04:27:31
【问题描述】:
 public function decrypt($str, $key){
    //AES, 256 ECB
    $data = rtrim(
                    mcrypt_decrypt(
                        MCRYPT_RIJNDAEL_256, 
                        $key, 
                        base64_decode($str), 
                        MCRYPT_MODE_ECB,
                        mcrypt_create_iv(
                            mcrypt_get_iv_size(
                                MCRYPT_RIJNDAEL_256,
                                MCRYPT_MODE_ECB
                            ), 
                            MCRYPT_RAND
                        )
                    ), "\0"
                );
   return $data;
}

$str 来自 ios app 加密字符串,他使用的 charset 是 NSUTF8StringEncoding 并使用方法 AES-256-ECB-PKCS7Padding 和 base64 输出。

加密前

$str-> 42z7t5nzwvbk14gbemc9

$key-> gxssh2016

在ios APP中加密后

$str-> D2k5t33l+HD3snFTU+gNYlCH/DQ37WO6I6nUYbGTDKc


注意:我用AES在线工具解密这个字符串可以得到正确的结果:42z7t5nzwvbk14gbemc9

但是,使用我的函数解密这个 $str 输出: x�Z����®(t�sڞ�<�^�q�P��`

如何在php中将其解密为42z7t5nzwvbk14gbemc9

【问题讨论】:

标签: php ios encryption cryptography aes


【解决方案1】:

MCRYPT_RIJNDAEL_256 不是 AES256。它是一种很少使用的密码(不是 AES 标准的一部分!),其操作与 AES 类似,但一次加密 256 位(32 字节)而不是 16 位。

如果您想使用 mcrypt 加密/解密 AES256 数据,请将 256 位(32 字节)密钥传递给 MCRYPT_RIJNDAEL_128

不过,最好完全避免使用 mcrypt。这是一个编写不佳的库,自 2007 年以来已被其开发人员抛弃。考虑改用 OpenSSL 扩展,例如

return openssl_decrypt(
    base64_decode($str),
    "aes-256-ecb",
    $key,
    OPENSSL_RAW_DATA
);

(正如您在回答中指出的那样,您的加密数据实际上是使用 AES128 加密的;将“256”更改为“128”,这将适用于您的示例数据。我已使用 AES256 留下此代码,以便它回答了所问的问题。)

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多