![]() |
|
![]() ![]() ![]() |
|
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
Добрый день.
Решил помучать себя и разобраться в способах и алгоритамх шифрования. Для начала взял алгоритм шифрования DES Погуглил, почитал на вики. После прочтения начали возникать вопросы. Первый вопрос, на который я бы хотел получить ответ: Что означает "перестановка" и каким образом она вычисляется? В вики в данной статье указана лишь результирующая таблица после перестановки (начальная перестановка, конечная перестановка, перестановка, применяемая к 32-битовому блоку и т.д.), и в других статьях посвященные этому алгоритму, в принципе, все тоже самое - лишь конечная таблица. |
|||
|
||||
spin2 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 15.12.2005 Где: Москва-Одесса Репутация: нет Всего: 31 |
DiMoN_TD, перестановка в s-блоках?
-------------------- |
|||
|
||||
DiMoN_TD |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
spin2,
до S-блоков я еще не дошел. В описании алгоритма есть вот такая строчка:
В этой таблице описан результат начальной перестановки:
Далее описывается:
А как они это получили - для меня загадка. Или же это стандартная таблица? Или есть какая-то функция, которая определяет перестановку, как в начальной перестановке так и в S-блоках? Это сообщение отредактировал(а) DiMoN_TD - 4.1.2012, 15:20 |
||||||
|
|||||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
Так, закономерность образования Таблицы начальной перестановки я понял, единственное что не понял, почему именно так.
|
|||
|
||||
redwhite90 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 14.7.2011 Репутация: нет Всего: нет |
это всегда так. входной параметр алгоритма
|
|||
|
||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
Кто может объяснить, как формируется ключ?
Первым этапом, как я понял, необходимо преобразовать ключ в 64битный массив. Из него каждый 8й бит надо исключить, и получим 56битный массив. Из него сделать перестановку по таблице, и разбить на два блока Co и Do по 28 бит. А вот дальше я не понял, что за циклические сдвиги происходят и почему в конечном итоге получается 48 битный ключ? |
|||
|
||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
Нашел источник, где на "пальцах" показывается, как формируется ключ.
http://orlingrabbe.com/des.htm Выкладываю, если кто-то вдруг по поиску наткнется на эту же тему. Это сообщение отредактировал(а) DiMoN_TD - 9.1.2012, 18:43 |
|||
|
||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
В конечном итоге разобрался как это все работает.
Источники, которыми пользовался это: 1. http://orlingrabbe.com/des.htm 2. Wikipedia Сверялся с онлайн криптатором Чуть позже выложу исходники на PHP, надо привести в читабельный вид. |
|||
|
||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
Возник еще один вопрос. Теперь по поводу дешифровки. Не получается расшифровать данные.
Везде пишут, что алгоритм дешифровки - это обратный метод шифровки, где: 1. Шифрованный текст преобразуется в 64-битовый блок. 2. Применяется перестановка согласно Конечной перестановки из алгоритма шифрования (IP(-1)) 3. Далее идет цикл из 16 шагов, где происходит "дешифровка":
4. Полученные результаты L(0) и R(0) конкатинируются в 64-битный конечный блок. 5. Конечный 64-битный блок подвергается начальной перестановке из алгоритма шифрования (IP(1)) В итоге у меня выходит тарабарщина. Т.е. текст криптуется нормально, а вот применяя описанное правило выше - дешифровка происходит неверно. Правильно ли я понял алгоритм дешифровки, или же что-то упустил? Заранее спасибо. |
|||
|
||||
spin2 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 15.12.2005 Где: Москва-Одесса Репутация: нет Всего: 31 |
DiMoN_TD, Там просто в обратную сторону идешь и все. Раз у тебя уже прога есть, отсекай по одному элементу и смотри, совпадают ли результаты.
-------------------- |
|||
|
||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
Выкладываю класс, написанный на PHP:
http://pastebin.com/vNM9UVaR Пример использования:
Как я и говорил выше - проблема с дешифровкой. Использую обратный метод шифрования, но в итоге не получается исходного текста. Глаз уже замылен, возможно кто-то из просматривающих эту тему посмотрит более свежим взглядом, и подскажет где я мог ошибиться. Более конкретно в методе decrypt(); |
|||
|
||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
Ну смотри. Алгоритм шифрования: 1. P = Plaintext 64bit block. 2. IP1 (P) 4. L(0) R(0). 3. 1...16 итераций, шифровка. На выходе L(16) R(16). Конкатинируем R(16) и L(16) = RL. 4. IP2 (RL) 5 C = Chipertext 64bit block Теперь алгоритм расшифровки должен быть следующим методом: 1. C = Chipertext 64bit block 2. IP2 ( С ) 3. 16...1 итераций, дешифровка. На выходе L(0) R(0). Конкатинируем L(0) и R(0) = LR. 4. IP1 (LR) 5. P = Plaintext 64bit block. Но на практике совершенно не получается. И еще, если отсекать по одному элементу, как ты утверждаешь, не мог бы ты указать, что с чем должно "совпадать" при шифровке и дешифровке? Это сообщение отредактировал(а) DiMoN_TD - 15.1.2012, 16:15 |
|||
|
||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
spin2, все, разобрался. Я, видимо, неправильно понял описанный метод дешифровки в этой статье:
http://protect.htmlweb.ru/des.htm описано:
Ну я и начал применять таблицу конечной перестановки в начале дешифровки. А оказывается, что надо было применить таблицу начальной перестановки. Спасибо за указание на пошаговое сравнение шифровки\дешифровки. Так бы еще долго ломал голову, в каком месте и ошибся. Допилю код - выложу на конечное обозрение. |
|||
|
||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
Как и обещал.
Выкладываю класс на php для криптования и декриптования текста алгоритмом DES методом ECB (в инете так и не нашел ни одного исходника): http://pastebin.com/ARYsde8g Пример использования:
Спасибо за помощь. Задача решена ![]() |
|||
|
||||
DiMoN_TD |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 16.12.2007 Репутация: нет Всего: нет |
Данный скрипт реализовал и опубликовал Тупалов Дмитрий.
[Доказательство того, что этот аккаунт принадлежит Тупалову Дмитрию.] ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |