SlowAES не может правильно расшифровать без оригинального размера - PullRequest
2 голосов
/ 20 февраля 2010

Первый постер здесь. Потрясающее сообщество здесь. После бесконечных часов поиска я не могу найти ответ на эту проблему, с которой сталкиваюсь.

Прежде всего, я не гуру, когда дело доходит до шифрования / дешифрования, криптологии и т. Д. Я только хочу зайти так далеко в этом мире, чтобы не потеряться. Основной фреймворк, на котором я пишу код, - это .NET, и меня попросили создать реализацию AES CBC для C #, которая может работать на JavaScript и ActionScript 3. Я успешно работал с обоими, но с JavaScript у меня возникла проблема.

Я решил использовать реализацию SlowAES AES, потому что она кажется наиболее популярной среди лучших взаимодействий.

Пожалуйста, смотрите следующие ссылки относительно моей проблемы ...

Выпуск № 9: http://code.google.com/p/slowaes/issues/detail?id=9

По сути, моя проблема со SlowAES заключается в том, что я не могу правильно расшифровать что-либо, не зная длины исходного незашифрованного текста. Это побеждает цель верно? Я должен быть в состоянии расшифровать зашифрованную строку без необходимости знать исходную строку.

Если я что-то упустил, я был бы благодарен, если бы указали в правильном направлении. К счастью, я в порядке, потому что реализация .NET AES, которую я собрал, может расшифровать то, что шифрует SlowAES, так же, как и реализация ActionScript 3.

На данный момент я бы хотел, чтобы SlowAES правильно расшифровывал.

Обновлено

После использования Remus я определил, что SlowAES использует схему заполнения PKCS5 / 7, но не удаляет ее должным образом. Теперь моя проблема, похоже, связана с C #, пониманием байтовых массивов и т. Д.

Я вижу последний символ в моем расшифрованном тексте «5», которому предшествует «0». Эта картина продолжается 5 раз. Теперь из того, что Ремус сказал ниже, я должен вычесть длину расшифрованной строки на это число. Но шаблон «05», означает ли это, что я удваиваю 5, получая 10, а затем вычитаю 10 из моей расшифрованной длины строки?

Кроме того, какой самый простой способ получить число, которое мне нужно вычесть? Я использую следующее, чтобы получить номер в настоящее время:

Byte[] decryptedBytes = System.Text.Encoding.ASCII.GetBytes(decrypted);<br> Byte padLengthByte = decryptedBytes[decryptedBytes.Length - 1];<br> Char padLengthChar = Convert.ToChar(padLengthByte);<br> String padLengthString = padLengthChar.ToString();<br> Int32 padLength = Int32.Parse(padLengthString);

Я уверен, что я делаю это неправильно. Опять же, любая помощь всегда ценится.

Еще один вопрос, который у меня возникает, как вы узнаете, применялся ли в первую очередь отступ для его удаления? Если «\ 07» представляет 7 байтов заполнения, что, если последний байт был «\ 01 \»?

Ответы [ 2 ]

5 голосов
/ 20 февраля 2010

Это потому, что, очевидно, SlowAES не реализует обычно используемые схемы заполнения, такие как PKCS: Проблема 4: Реализация заполнения PKCS7 . Даже если библиотека не реализует это, для вас это действительно тривиально: как только вы получите расшифрованный (дополненный) текст, просто проанализируйте последний блок и вычтите исходную длину из информации заполнения. Обивка PKCS7 описана в RFC2315 , если я не ошибаюсь.

Обновлено

Если текст дополняется PKCS7, последний байт в расшифрованном тексте будет содержать длину заполнения. Таким образом, вы расшифровываете, а затем удаляете столько символов из конца расшифрованного текста, сколько значение в последнем байте. Например.

  1. исходный текст: «Это оригинальный текст». Имеет длину 25.
  2. шифрование будет дополнять длину до 32 (следующий блок размером 16), поэтому он будет зашифровывать блок 'Это оригинальный текст \ 07 \ 07 \ 07 \ 07 \ 07 \ 07 \ 07'.
  3. дополненный блок зашифровывается в криптографический текст длиной 32
  4. Вы расшифровываете крипту длиной 32 и получаете заполненный текст из 2)
  5. последний байт дешифрованного блока равен '\ 07', поэтому вы должны вычесть 7 байтов из дешифрованного блока. В результате получается оригинальный текст длиной 25: «Это оригинальный текст»

PS: Я бы добавил код JavaScript, но мой навык кодирования JavaScript довольно ржавый.

0 голосов
/ 20 февраля 2010

Одна вещь, которую вы можете сделать, это дополнить ваши данные округлением до полного размера 128-битного блока. Таким образом, вам не нужно беспокоиться о заполнении PKCS # 7, потому что вы просто сделали это сами. вряд ли оптимально, но, по крайней мере, вы работаете:)

...