2012-04-05 60 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