2012-04-05 3 views
0

Я новичок в AES, но из того, что я нашел, существует несколько режимов (ECB, CBC и т. Д.), А в разных режимах нужны различные требования вектора инициализации, блоки и кодировки. Я пытаюсь расшифровать следующуюAES decrypt in 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; 
} 

Я думаю, что может быть что-то отсутствует в отношении базировать 64 кодирования или поворотом ключа в бинарное первый. Я пробовал расшифровать многие вещи, и все, что я могу произвести, это тарабарщина. Любая помощь будет очень оценена.

+0

У вас есть строка с кодировкой base64. Его нужно будет декодировать обратно в двоичный мусор, прежде чем вы его подадите в mcrypt. –

+0

Я пробовал это ... и это может быть частью этого, но я все еще получаю тарабарщину, даже делая это ... Я обновлю свой вопрос, чтобы показать его, хотя – hackartist

ответ

2

Ну, сам инструмент не говорит, как именно он зашифрован. И вы также не можете установить значение 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

+0

ОК, теперь многое из истории ясна сейчас ... Я обнаружил, что первые 16 байт фактических данных интерпретируются как IV, как вы предполагали, но это означало, что с помощью CBC я пропускаю первые 16 байт. Однако я могу получить эти байты, запустив на них ECB, а затем объединить их вместе. – hackartist