Расшифровка AES в php

Я новичок в 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 или сначала превратить ключ в двоичный код. Я пытался расшифровать многие вещи, и все, что я могу сделать, это тарабарщина. Любая помощь будет очень признательна.


person hackartist    schedule 05.04.2012    source источник
comment
У вас есть строка в кодировке base64. Его нужно будет декодировать обратно в двоичный мусор, прежде чем вы отправите его в mcrypt.   -  person Marc B    schedule 05.04.2012
comment
Я пробовал это ... и это может быть частью этого, но я все еще получаю тарабарщину, даже делая это ... Я обновлю свой вопрос, чтобы показать это, хотя   -  person hackartist    schedule 05.04.2012


Ответы (1)


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

person vstm    schedule 05.04.2012
comment
Большое спасибо. Я буквально часами пытался что-то сделать (в том числе я думал, что это 128, а не 256). Как ты вообще это узнал? - person hackartist; 05.04.2012
comment
хорошо, теперь все ясно... Я обнаружил, что первые 16 байтов фактических данных интерпретировались как IV, как вы предложили, но это означало, что при использовании CBC я пропускаю первые 16 байтов. Однако я могу получить эти байты, запустив на них ECB, а затем объединить их вместе. - person hackartist; 05.04.2012