Я пытаюсь использовать библиотеку php mycrypt для расшифровки следующего:
Ключ: aaaaaaaabbbbbbbbccccccccdddddddd
Данные: b5057bbc04b842a96144a0f617f2820e
Ожидаемый результат: Test123123
Данные зашифрованы с помощью 3DES в режиме ECB. Код, с которым я сейчас работаю, расшифровывает шестнадцатеричное значение до «e2119b734b5050e3», что переводится как «âsKPPã». Я пытался использовать открытый SSL, который возвращает «Ложь».
Код выглядит следующим образом:
(Версия PHP 5.3.3)
$key = 'aaaaaaaabbbbbbbbccccccccdddddddd';
$key = pack('H*',$key);
// DATA
$data = 'b5057bbc04b842a96144a0f617f2820e';
$data = pack('H'.strlen($key),$data);
// DECRYPT MCRYPT
$data = rtrim(mcrypt_decrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_ECB), "\0");
$decryptedHex = unpack('H*',$data);
// DECRYPT OPEN SSL (RETURNS FALSE)
$result = openssl_decrypt($data,'des-ede3', $key);
// ECHO
echo $decryptedHex[1];
Проблема здесь в том, что слишком много недостающей информации — точный вариант 3DES, информация о заполнении. Немного поигравшись с параметрами шифрования, вместо расшифровки можно попытаться сгенерировать зашифрованный текст, чтобы найти правильные параметры. Они оказываются
openssl_encrypt($ptext,'des-ede', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING)
куда $ptext
является "Test123123\0\0\0\0\0\0"
Зашифрованный текст также может быть расшифрован с помощью
$result = openssl_decrypt($data,'des-ede', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);
Вам нужно будет перейти на более новую и поддерживаемую (PHP 5.3 была выпущена в 2009 году и больше не поддерживается с 2015 года) версию PHP.
Других решений пока нет …