PHP-AES-256-ECB解密乱码

Kev*_*Koo -3 php encryption cryptography aes ios

 public function decrypt($str, $key){\n    //AES, 256 ECB\n    $data = rtrim(\n                    mcrypt_decrypt(\n                        MCRYPT_RIJNDAEL_256, \n                        $key, \n                        base64_decode($str), \n                        MCRYPT_MODE_ECB,\n                        mcrypt_create_iv(\n                            mcrypt_get_iv_size(\n                                MCRYPT_RIJNDAEL_256,\n                                MCRYPT_MODE_ECB\n                            ), \n                            MCRYPT_RAND\n                        )\n                    ), "\\0"\n                );\n   return $data;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

加密前

\n\n

$str->42z7t5nzwvbk14gbemc9

\n\n

$键->gxssh2016

\n\n

ios APP加密后

\n\n

$str->D2k5t33l+HD3snFTU+gNYlCH/DQ37WO6I6nUYbGTDKc

\n\n
\n\n

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

\n\n

但是,使用我的函数解密此 $str 输出:\n x\xef\xbf\xbdZ\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc2\xae(t\xef\xbf\xbds\xda\x9e\xef\xbf\xbd<\xef\xbf\xbd^\xef\xbf\xbdq\xef\xbf\xbdP\xef\xbf\xbd\xef\xbf\xbd`

\n\n

我怎样才能42z7t5nzwvbk14gbemc9在php中解密它?

\n

小智 5

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
);
Run Code Online (Sandbox Code Playgroud)

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