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

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

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

<code>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 );
</code>

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

<code>$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);
</code>

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

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

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

 deCorvett17 апр. 2012 г., 22:56
Вероятно, да, но этот образец Java должен работать (по крайней мере, он так говорит). & Quot; ключевое слово & Quot; не является действительным секретным ключом, но остальная часть кода должна быть рабочим Java-кодом.
 Maarten Bodewes17 апр. 2012 г., 21:43
Ваш провайдер идиот, другого слова для этого нет. IV (называемый SR) никогда не может быть случайным для расшифровки. Ключевое слово не является действительным секретным ключом. DES не должен использоваться, равно как и кодирование ECB. getBytes никогда не должен вызываться без указания кодировки символов. И это то, что меня прямо поразило.
 Maarten Bodewes18 апр. 2012 г., 02:01
Хм, небольшое изменение, этот SR не используется для IV, но используется для любой случайной части Шифра (что фактически означает, что он вообще не используется). Так что код Java может работать. Не то, чтобы IV делал какие-либо изменения в режиме ECB, но что угодно.
 Maarten Bodewes18 апр. 2012 г., 08:36
& Quot; Ключевое слово & Quot; к сожалению всего 7 символов. Ваша платформа, вероятно, использует 1-байтовую кодировку UTF-8 для символов ASCII, поэтому ваш код больше не будет работать. Вы можете довольно легко сгенерировать симметричный «шифровать» метод в Java или PHP, протестируйте его с расшифровкой Java, а затем приступайте к тестированию кода PHP. Затем вы можете отправить нам тестовые векторы, а не просто код (и вы также можете создавать модульные тесты).

Ответы на вопрос(1)

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

 18 апр. 2012 г., 14:34
Зависит от того, что вы ожидаете в результате? Вы не сказали нам, поэтому мы не можем сказать. Вот почему я рекомендовал также написать метод ecrypt ... О, и 11 байтов не принимаются при создании ключей DES, аааик.
 deCorvett18 апр. 2012 г., 10:22
Фактическое ключевое слово длиной 11 символов. Я попробовал с вашим предложением всех нулей, но не повезло. Я получаю много символов в ответе службы, так что я думаю, что, вероятно, мне нужно преобразование перед расшифровкой.

Ваш ответ на вопрос