PHP-AES-256-ECB解密乱码
PHP-AES-256-ECB decrypt messy code
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
)
), "[=11=]"
);
return $data;
}
$str来自ios应用程序加密字符串,他使用的字符集是NSUTF8StringEncoding
并使用方法AES-256-ECB-PKCS7Padding
和base64输出。
加密前
$str->42z7t5nzwvbk14gbemc9
$key->gxssh2016
在iosAPP加密后
$str->D2k5t33l+HD3snFTU+gNYlCH/DQ37WO6I6nUYbGTDKc
注意:我用AES在线工具解密这个字符串可以得到正确的结果:42z7t5nzwvbk14gbemc9
但是,使用我的函数解密这个 $str 输出:
x�Z����®(t�sڞ�<�^�q�P
��`
如何在 php 中将其解密为 42z7t5nzwvbk14gbemc9
?
MCRYPT_RIJNDAEL_256
不是 AES256。它是一种很少使用的密码(不是 AES 标准的一部分!),其操作类似于 AES,但一次加密 256 位(32 字节)而不是 16 位。
如果您想 encrypt/decrypt 使用 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 保留此代码以便它按要求回答问题。)
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
)
), "[=11=]"
);
return $data;
}
$str来自ios应用程序加密字符串,他使用的字符集是NSUTF8StringEncoding
并使用方法AES-256-ECB-PKCS7Padding
和base64输出。
加密前
$str->42z7t5nzwvbk14gbemc9
$key->gxssh2016
在iosAPP加密后
$str->D2k5t33l+HD3snFTU+gNYlCH/DQ37WO6I6nUYbGTDKc
注意:我用AES在线工具解密这个字符串可以得到正确的结果:42z7t5nzwvbk14gbemc9
但是,使用我的函数解密这个 $str 输出:
x�Z����®(t�sڞ�<�^�q�P
��`
如何在 php 中将其解密为 42z7t5nzwvbk14gbemc9
?
MCRYPT_RIJNDAEL_256
不是 AES256。它是一种很少使用的密码(不是 AES 标准的一部分!),其操作类似于 AES,但一次加密 256 位(32 字节)而不是 16 位。
如果您想 encrypt/decrypt 使用 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 保留此代码以便它按要求回答问题。)