PHP上的解密在16位之后出现问题

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,

我在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, 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(以及钥匙,就这一点而言)应该由