AES在php中的解密

AES在php中的解密,php,encryption,base64,aes,decoding,Php,Encryption,Base64,Aes,Decoding,我不熟悉AES,但据我所知,有几种模式(ECB、CBC等),不同的模式需要不同的初始化向量要求、块和编码。我正在尝试解码以下内容 Xrb9YtT7cHUdpHYIvEWeJIAbkxWUtCNcjdzOMgyxJzU/vW9xHivdEDFKeszC93B6MMkhctR35e+YkmYI5ejMf5ofNxaiQcZbf3OBBsngfWUZxfvnrE2u1lD5+R6cn88vk4+mwEs3WoAht1CAkjr7P+fRIaCTckWLaF9ZAgo1/rvYA8EGDc+uXgWv9

我不熟悉AES,但据我所知,有几种模式(ECB、CBC等),不同的模式需要不同的初始化向量要求、块和编码。我正在尝试解码以下内容

Xrb9YtT7cHUdpHYIvEWeJIAbkxWUtCNcjdzOMgyxJzU/vW9xHivdEDFKeszC93B6MMkhctR35e+YkmYI5ejMf5ofNxaiQcZbf3OBBsngfWUZxfvnrE2u1lD5+R6cn88vk4+mwEs3WoAht1CAkjr7P+fRIaCTckWLaF9ZAgo1/rvYA8EGDc+uXgWv9KvYpDDsCd1JStrD96IACN3DNuO28lVOsKrhcEWhDjAx+yh72wM=
使用php和(文本)键“043J9FMD38JRR4DNEJ3FD11111111”,模式为CBC,IV为全零。我能够使用它,但无法在php中使用它。以下是我正在使用的代码:

function decrypt_data($data, $iv, $key) {
    $data   = base64_decode($data);
    $cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');

    // initialize encryption handle
    if (mcrypt_generic_init($cypher, $key, $iv) != -1) {
            // decrypt
            $decrypted = mdecrypt_generic($cypher, $data);

            // clean up
            mcrypt_generic_deinit($cypher);
            mcrypt_module_close($cypher);

            return $decrypted;
    }

    return false;
} 

我想我可能遗漏了一些与base64编码有关的东西,或者先将密钥转换为二进制。我试过解码很多东西,但我能做的只是胡言乱语。任何帮助都将不胜感激

工具本身并没有说明加密的准确程度。你也不能设置IV,所以很难得到正确的参数(因为它们必须相等)

经过一番猜测,我发现了以下几点:

  • IV在密文的前面
  • 密文用aes-128-cbc加密
因此,您必须修改代码:

function decrypt_data($data, $iv, $key) {
    $cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

    if(is_null($iv)) {
        $ivlen = mcrypt_enc_get_iv_size($cypher);
        $iv = substr($data, 0, $ivlen);
        $data = substr($data, $ivlen);
    }

    // initialize encryption handle
    if (mcrypt_generic_init($cypher, $key, $iv) != -1) {
            // decrypt
            $decrypted = mdecrypt_generic($cypher, $data);

            // clean up
            mcrypt_generic_deinit($cypher);
            mcrypt_module_close($cypher);

            return $decrypted;
    }

    return false;
}

$ctext = "Xrb9YtT7cHUdpHYIvEWeJIAbkxWUtCNcjdzOMgyxJzU/vW9x" .
         "HivdEDFKeszC93B6MMkhctR35e+YkmYI5ejMf5ofNxaiQcZb" .
         "f3OBBsngfWUZxfvnrE2u1lD5+R6cn88vk4+mwEs3WoAht1CA" .
         "kjr7P+fRIaCTckWLaF9ZAgo1/rvYA8EGDc+uXgWv9KvYpDDs" .
         "Cd1JStrD96IACN3DNuO28lVOsKrhcEWhDjAx+yh72wM=";

$key = "043j9fmd38jrr4dnej3FD11111111111";

$res = decrypt_data(base64_decode($ctext), null, $key);

我不确定为什么不使用aes-256-cbc加密密钥长度-我已经检查了它的来源,并且它支持它,但是我必须调试它才能真正验证它。

工具本身并没有说明它是如何加密的。你也不能设置IV,所以很难得到正确的参数(因为它们必须相等)

经过一番猜测,我发现了以下几点:

  • IV在密文的前面
  • 密文用aes-128-cbc加密
因此,您必须修改代码:

function decrypt_data($data, $iv, $key) {
    $cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

    if(is_null($iv)) {
        $ivlen = mcrypt_enc_get_iv_size($cypher);
        $iv = substr($data, 0, $ivlen);
        $data = substr($data, $ivlen);
    }

    // initialize encryption handle
    if (mcrypt_generic_init($cypher, $key, $iv) != -1) {
            // decrypt
            $decrypted = mdecrypt_generic($cypher, $data);

            // clean up
            mcrypt_generic_deinit($cypher);
            mcrypt_module_close($cypher);

            return $decrypted;
    }

    return false;
}

$ctext = "Xrb9YtT7cHUdpHYIvEWeJIAbkxWUtCNcjdzOMgyxJzU/vW9x" .
         "HivdEDFKeszC93B6MMkhctR35e+YkmYI5ejMf5ofNxaiQcZb" .
         "f3OBBsngfWUZxfvnrE2u1lD5+R6cn88vk4+mwEs3WoAht1CA" .
         "kjr7P+fRIaCTckWLaF9ZAgo1/rvYA8EGDc+uXgWv9KvYpDDs" .
         "Cd1JStrD96IACN3DNuO28lVOsKrhcEWhDjAx+yh72wM=";

$key = "043j9fmd38jrr4dnej3FD11111111111";

$res = decrypt_data(base64_decode($ctext), null, $key);

我不确定为什么不使用aes-256-cbc加密密钥长度-我已经检查了它的源代码,它支持它,但我必须调试它才能真正验证它。

您有一个base64编码的字符串。在你把它反馈给mcrypt之前,它必须被解码回二进制垃圾。我已经试过了。。。这可能是它的一部分,但我仍然得到胡言乱语,即使这样做。。。我将更新我的问题以显示它,尽管您有一个base64编码字符串。在你把它反馈给mcrypt之前,它必须被解码回二进制垃圾。我已经试过了。。。这可能是它的一部分,但我仍然得到胡言乱语,即使这样做。。。我会更新我的问题来表达我的想法谢谢你。我真的试了几个小时(包括我想看看是不是128而不是256)。你是怎么发现的?好吧,现在更多的故事都清楚了。。。我发现实际数据的前16个字节按照您的建议被解释为IV,但这意味着使用CBC会丢失前16个字节。不过,我可以通过运行ECB获得这些字节,然后将它们合并在一起。非常感谢。我真的试了几个小时(包括我想看看是不是128而不是256)。你是怎么发现的?好吧,现在更多的故事都清楚了。。。我发现实际数据的前16个字节按照您的建议被解释为IV,但这意味着使用CBC会丢失前16个字节。不过,我可以通过在这些字节上运行ECB获得这些字节,然后将它们合并在一起。