0

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

Xrb9YtT7cHUdpHYIvEWeJIAbkxWUtCNcjdzOMgyxJzU/vW9xHivdEDFKeszC93B6MMkhctR35e+YkmYI5ejMf5ofNxaiQcZbf3OBBsngfWUZxfvnrE2u1lD5+R6cn88vk4+mwEs3WoAht1CAkjr7P+fRIaCTckWLaF9ZAgo1/rvYA8EGDc+uXgWv9KvYpDDsCd1JStrD96IACN3DNuO28lVOsKrhcEWhDjAx+yh72wM=

使用 php 和(文本)键“043j9fmd38jrr4dnej3FD11111111111”,模式为 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;
} 

我想我可能会遗漏与 base 64 编码或首先将密钥转换为二进制相关的内容。我试过解码很多东西,但我能产生的只是胡言乱语。任何帮助将不胜感激。

4

1 回答 1

3

好吧,该工具本身并没有说明它是如何加密的。而且您也不能设置 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 对其进行加密 - 我已经检查了as3crypto-library的来源并且它有点支持它,但我必须调试它才能真正验证它。

于 2012-04-05T05:43:57.113 回答