PHP上的解密在16位之后出现问题
我在ios端进行AES加密,我使用base64对该字符串进行编码并发送到php端。在php端,我有以下代码:PHP上的解密在16位之后出现问题,php,encryption,Php,Encryption,我在ios端进行AES加密,我使用base64对该字符串进行编码并发送到php端。在php端,我有以下代码: <?php $key = 'a16byteslongkey!'; $data = base64_decode('LsCH4nvvGPKN67v94Ig9BweQgOk9rtDdK7ZugeJkTS8='); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); $iv = substr($data,
<?php
$key = 'a16byteslongkey!';
$data = base64_decode('LsCH4nvvGPKN67v94Ig9BweQgOk9rtDdK7ZugeJkTS8=');
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = substr($data, 0, $iv_size);
function aes256_cbc_decrypt($key, $data, $iv) {
if(32 !== strlen($key)) $key = hash('SHA256', $key, true);
if(16 !== strlen($iv)) $iv = hash('MD5', $iv, true);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_ECB, $iv);
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}
$result = aes256_cbc_decrypt($key,$data,$iv);
var_dump($result);
?>
但是当我运行这个代码时,我得到了这个“anil”。mnd@gmail.cA���U�" . 我应该找阿尼尔的。mnd@gmail.com.我只有前16个字符是正确的
我是加密新手,所以不太清楚到底出了什么问题
我是加密新手,所以不太清楚到底出了什么问题
如果你是新来的,想要一些“刚刚好用”的东西,用它来代替自己写
但是,如果您准备迎接挑战,请继续阅读:
您的代码不可读。让我们添加一些空白
$key = 'a16byteslongkey!';
$data = base64_decode('LsCH4nvvGPKN67v94Ig9BweQgOk9rtDdK7ZugeJkTS8=');
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = substr($data, 0, $iv_size);
function aes256_cbc_decrypt($key, $data, $iv)
{
if (32 !== strlen($key)) {
$key = hash('SHA256', $key, true);
}
if (16 !== strlen($iv)) {
$iv = hash('MD5', $iv, true);
}
$data = mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$key,
$data,
MCRYPT_MODE_ECB,
$iv
);
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}
$result = aes256_cbc_decrypt($key,$data,$iv);
var_dump($result);
具体问题:
- 您正在对名为
的函数使用aes256\u cbc
(您看到了吗?)MCRYPT\u MODE\u ECB
- 当我把它换掉时,我会感觉到
- 您的加密方法也可能被破坏,因为
-
请,请考虑。
和strlen()
是易碎的。请参阅:substr()
- 使用,而不是散列函数
- 您的IV(以及钥匙,就这一点而言)应该由
您的代码不可读。让我们添加一些空白
$key = 'a16byteslongkey!';
$data = base64_decode('LsCH4nvvGPKN67v94Ig9BweQgOk9rtDdK7ZugeJkTS8=');
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = substr($data, 0, $iv_size);
function aes256_cbc_decrypt($key, $data, $iv)
{
if (32 !== strlen($key)) {
$key = hash('SHA256', $key, true);
}
if (16 !== strlen($iv)) {
$iv = hash('MD5', $iv, true);
}
$data = mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$key,
$data,
MCRYPT_MODE_ECB,
$iv
);
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}
$result = aes256_cbc_decrypt($key,$data,$iv);
var_dump($result);
具体问题:
- 您正在对名为
的函数使用aes256\u cbc
(您看到了吗?)MCRYPT\u MODE\u ECB
- 当我把它换掉时,我会感觉到
- 您的加密方法也可能被破坏,因为
-
请,请考虑。
和strlen()
是易碎的。请参阅:substr()
- 使用,而不是散列函数
- 您的IV(以及钥匙,就这一点而言)应该由