2012-04-05 160 views
0

我是AES新手,但从我发现的有几种模式(ECB,CBC等),不同的模式需要不同的初始化矢量要求,块和编码。我想下面的AES解密在PHP

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

使用PHP和(文本)键“043j9fmd38jrr4dnej3FD11111111111”与模式CBC和全零的IV解码。我能够得到它与this tool,但无法在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编码或转动钥匙到进位争先。我试着解码很多东西,我所能产生的只是乱码。任何帮助将非常感激。

+0

你有一个base64编码的字符串。在将它提供给mcrypt之前,它必须解码回二进制垃圾。 – 2012-04-05 04:23:45

+0

我曾试过......它可能是它的一部分,但我仍然得到了胡言乱语,即使这样做......我会更新我的问题,以显示它虽然 – hackartist 2012-04-05 04:28:23

回答

2

那么工具本身并没有说明它是如何加密的。而且你也不能设置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的来源,它支持它,但我将不得不调试它来真正验证它。

+0

非常感谢。我几乎是在尝试几个小时(包括我认为是否是128而不是256)。你怎么知道这件事的? – hackartist 2012-04-05 07:07:19

+0

好了,现在更多的故事已经清楚了......我发现实际数据的前16个字节被解释为IV,正如你所建议的那样,但这意味着通过使用CBC我错过了前16个字节。但是,我可以通过在它们上运行ECB来获取这些字节,然后将它们合并在一起。 – hackartist 2012-04-05 07:54:15