PHP-AES-256-ECB解密凌乱的代码

时间:2016-05-11 04:27:31

标签: php ios encryption cryptography aes

 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 encrypt字符串,他使用charset为NSUTF8StringEncoding并使用方法AES-256-ECB-PKCS7Padding和base64输出。

加密前

$ STR-> 42z7t5nzwvbk14gbemc9

$键 - > gxssh2016

在ios APP加密后

$ STR-> D2k5t33l+HD3snFTU+gNYlCH/DQ37WO6I6nUYbGTDKc

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

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

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

1 个答案:

答案 0 :(得分:2)

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保留此代码,以便它回答了问题。)

相关问题