Использование MCrypt для расшифровки зашифрованного текста (режим 3DES CBC) - PullRequest
0 голосов
/ 17 июля 2009

У меня есть зашифрованный текст, зашифрованный в режиме 3DES CBC, и у меня возникают проблемы с его расшифровкой. У меня есть следующая информация (не фактические значения):

<?php
// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

// The initialisation vector
$ivec = '0102030405060708';

// A token which looks something like this
$token = '2ad82e09e3b4e7c491e4bb9fb7c606e1';
?>

Я основал свою функцию дешифрования на PHP-классе, который можно найти в этом блоге . Это выглядит так:

<?php
function decrypt($key,$iv,$token) {
    $td = mcrypt_module_open('tripledes', '', 'cbc', ''); 
    $iv = substr($iv, 0, mcrypt_enc_get_iv_size($td)); 
    $expected_key_size = mcrypt_enc_get_key_size($td); 

    $key = substr(md5($key), 0, $expected_key_size); 
    mcrypt_generic_init($td, $key, $iv);

    $decrypted_string = trim(mdecrypt_generic($td, base64_decode($token)));

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return $decrypted_string;
}
?>

Однако я не уверен, как ввести три ключа в алгоритм. Я попытался объединить их в цепочку так: $ key1. $ Key2. $ Key3 и в обратном порядке, но безрезультатно.

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 05 августа 2009

Я нашел проблему с функцией в конце. Это была комбинация преобразования ключа, IVEC и токена из Hex, удаления хеша MD5 ключа дешифрования и удаления декодирования Base64 получающегося в результате простого текста.

Символ заполнения, который привел к простому тексту, был немного странным, но он был удален с помощью rtrim (). Также стоит отметить, что изначально шифрование выполнялось в JSP с использованием некоторых стандартных библиотек Java, поэтому это может быть полезно для всех, кто выбирает Java Encryption → PHP Decryption.

Спасибо за вашу помощь VolkerK, вот функция, которую я в конечном итоге использовал (включая вашу шестнадцатеричную функцию, которую я не добавил ниже):

$algorithm = 'tripledes';
$key   = 'F123ACA...'; // Some hex key
$ivec  = 'FE12FA1...'; // Some hex ivec
$token = 'F2ACE12...'; // Some hex token
$mode  = 'cbc';

$key    = foo($key);
$ivec   = foo($ivec);
$token  = foo($token);

function decrypt($key,$iv,$algorithm,$mode,$token) {
    $td = mcrypt_module_open($algorithm, '', $mode, '') ; 
    $iv = substr($iv, 0, mcrypt_enc_get_iv_size($td));

    $expected_key_size = mcrypt_enc_get_key_size($td); 
    $key = substr($key, 0, $expected_key_size); 

    mcrypt_generic_init($td, $key, $iv);

    $response = rtrim(mdecrypt_generic($td, $token), '');

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return $response;
}

$plaintext = decrypt($key,$ivec,$algorithm,$mode,$token);
2 голосов
/ 17 июля 2009

// Три 16-символьных длинных ключа
$ Ожидаемый_ключ__размера равен 24, 3 * 8. Ключи скорее всего в шестнадцатеричном формате.
function foo($hex) {
    $rv = '';
    foreach(str_split($hex, 2) as $b) {
        $rv .= chr(hexdec($b));
    }
    return $rv;
}

// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

$key = foo($key1.$key2.$key3);
...