Расшифровка DES/ECB/PKCS5Padding в PHP

Мне нужно расшифровать с помощью PHP (или Javascript) некоторые сервисные вызовы. Я потратил весь день, пытаясь это сделать, но не смог правильно расшифровать.

В качестве справки поставщик услуг прислал мне следующий пример кода расшифровки на Java:

DESKeySpec dks = new DESKeySpec("keyword".getBytes()); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
SecureRandom sr = new SecureRandom();  
cipher.init( Cipher.DECRYPT_MODE, key ,sr); 

byte b[] = response.toByteArray();      
byte decryptedData[] = cipher.doFinal( b );

Я думаю, что я на правильном пути, используя:

$td = mcrypt_module_open(MCRYPT_DES, '', 'ecb', '');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = substr($keyword, 0, mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $data);
$decrypted = pkcs5_unpad($decrypted);

Но, честно говоря, я уверен, что все испортил с настройкой $iv createg и $keyword (или, может быть, с типами $data или $decrypted?). Функция pkcs5_unpad выглядит следующим образом:

function pkcs5_unpad($text)
{
   $pad = ord($text{strlen($text)-1});
   if ($pad > strlen($text)) return false;
   return substr($text, 0, -1 * $pad);
}

Я не только нуб в php, но и в методах криптографии... не могли бы вы помочь мне решить эту проблему?


person deCorvett    schedule 17.04.2012    source источник
comment
Ваш провайдер дебил, по другому не скажешь. IV (называемый SR) никогда не может быть случайным для расшифровки. Ключевое слово не является допустимым секретным ключом. Не следует использовать ни DES, ни кодировку ECB. getBytes никогда не следует вызывать без указания кодировки символов. И это как раз то, что ужалило меня прямо.   -  person Maarten Bodewes    schedule 17.04.2012
comment
Вероятно, да, но этот пример Java должен работать (по крайней мере, он так говорит). ключевое слово не является фактическим секретным ключом, но остальная часть кода должна быть рабочим кодом Java.   -  person deCorvett    schedule 18.04.2012
comment
Хм, небольшое изменение, что SR не используется для IV, а используется для любой случайной части шифра (что на самом деле означает, что он вообще не используется). Так что код Java может работать. Не то чтобы IV вносил какие-либо изменения в режим ECB, но что угодно.   -  person Maarten Bodewes    schedule 18.04.2012
comment
Ключевое слово, к сожалению, всего 7 символов. Ваша платформа, вероятно, использует 1-байтовую кодировку UTF-8 для символов ASCII, поэтому ваш код больше не будет работать. Вы можете довольно легко сгенерировать метод симметричного шифрования на Java или PHP, протестировать его с помощью расшифровки Java, а затем приступить к тестированию кода PHP. Затем вы можете отправить нам тестовые векторы вместо простого кода (и вы также можете создавать модульные тесты).   -  person Maarten Bodewes    schedule 18.04.2012


Ответы (1)


Убедитесь, что ваш ключ состоит из одних и тех же байтов (строки могут быть закодированы по-разному), и передайте ему IV, заполненный нулями. Режим ECB не использует IV (и в руководстве по PHP это указано), но если вы дадите ему одно значение по умолчанию для всех нулей - IV будет XOR с первым текстовым блоком, поэтому установите его на все нули отменит эту операцию. Также убедитесь, что входные шифрованные данные совпадают. Игнорируйте заполнение в первую очередь, вы сможете проверить правильность результата перед распаковкой.

person Maarten Bodewes    schedule 18.04.2012
comment
Фактическое ключевое слово имеет длину 11 символов. Я пробовал с вашим предложением все нули, но безуспешно. Я получаю много символов в ответе службы, поэтому я думаю, что мне, вероятно, нужно какое-то преобразование перед расшифровкой. - person deCorvett; 18.04.2012
comment
Зависит тоже, что вы ожидаете в результате? Вы не сказали нам, поэтому мы не можем сказать. Вот почему я рекомендовал также написать метод шифрования ... Да, и 11 байтов не принимаются при создании ключей DES, на самом деле. - person Maarten Bodewes; 18.04.2012