3des в php - не могу получить хороший ключ / строку
Мне нужно декодировать строку 3des в php, и у меня пока нет опыта расшифровки...
Первый шаг: получить ключ и набор строк для декодирования - у меня это уже есть.
У меня есть эта информация о алгоритме:
тип: CBC, заполнение - PKCS5, вектор инициализации (iv?) - массив из восьми нулей
Я пытаюсь так:
// very simple ASCII key and IV
$key = "passwordDR0wSS@P6660juht";
$iv = "password";
//$iv = array('0','0','0','0','0','0','0','0');
//$iv = "00000000";
$cipher = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');
//$iv = mcrypt_enc_get_iv_size($cipher);
// DECRYPTING
echo "<b>String to decrypt:</b><br />51196a80db5c51b8523220383de600fd116a947e00500d6b9101ed820d29f198c705000791c07ecc1e090213c688a4c7a421eae9c534b5eff91794ee079b15ecb862a22581c246e15333179302a7664d4be2e2384dc49dace30eba36546793be<br /><br />";
echo "<b>Decrypted 3des string:</b><br /> ".SimpleTripleDesDecrypt('51196a80db5c51b8523220383de600fd116a947e00500d6b9101ed820d29f198c705000791c07ecc1e090213c688a4c7a421eae9c534b5eff91794ee079b15ecb862a22581c246e15333179302a7664d4be2e2384dc49dace30eba36546793be')."<br />";
function SimpleTripleDesDecrypt($buffer) {
global $key, $iv, $cipher;
mcrypt_generic_init($cipher, $key, $iv);
$result = rtrim(mdecrypt_generic($cipher, hex2bin($buffer)), "\0");
mcrypt_generic_deinit($cipher);
return $result;
}
function hex2bin($data)
{
$len = strlen($data);
return pack("H" . $len, $data);
}
В начале вы видите пример данных, и на этих данных код работает нормально. Проблема начинается, когда я пытаюсь использовать свои собственные данные, которые я получаю из базы данных через веб-сервис SOAP. Я вижу эту ошибку:
Предупреждение: pack() [function.pack]: Тип H: недопустимая шестнадцатеричная цифра в....
Я получаю это несмотря на попытки с различными типами кодирования в сценарии. Сам файл скрипта находится в ANCI.
Кроме того: как вы видите в комментариях, я также провел несколько экспериментов с IV, но это не имеет смысла, не имея дело с первой проблемой, которую я догадываюсь.
Еще одна вещь - это заполнение == PKCS5. Нужно ли мне это использовать и как мне это делать в моем случае?
Я был бы очень признателен за помощь в этом.
1 ответ
Хорошо, я нашел решение, основанное главным образом на этом посте: PHP Equivalent для Java Triple DES шифрование / дешифрование - спасибо, ребята, +1.
$iv = array('0','0','0','0','0','0','0','0');
echo @decryptText($temp->patient->firstName, $deszyfrator->return->rawDESKey, $iv);
echo @decryptText($temp->patient->surname, $deszyfrator->return->rawDESKey, $iv);
function decryptText($encryptText, $key, $iv) {
$cipherText = base64_decode($encryptText);
$res = mcrypt_decrypt("tripledes", $key, $cipherText, "cbc", $iv);
$resUnpadded = pkcs5_unpad($res);
return $resUnpadded;
}
function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text)) return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
Однако я получаю предупреждение (скрыто с @ сейчас). "Iv должен иметь ту же длину, что и размер блока" - я перепробовал все комбинации, которые смог выяснить, и не могу от этого избавиться. Есть идеи, люди?
Редактировать: исправлена вторичная проблема. Этот коде исправит iv:
$iv_size=mcrypt_get_iv_size("tripledes","cbc");
$iv = str_repeat("\0", $iv_size); //iv size for 3des is 8