Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Безопасность, Шифрование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2015, 02:08   #1
sinestro
Пользователь
 
Регистрация: 24.02.2012
Сообщений: 88
Вопрос Алгоритм шифрования DES

здравствуйте, уже 4 день мучаюсь с данным алгоритмом.
по мануалам последовательность шифрования такая:

1) берём блок 64 бита
2)делаем первичную перестановку IР блока 64 бит
3)разделяем его по 32 бита на левый и правый
4)расширяем правый блок до 48 бит
5)правый блок = (правый блок) XOR (ключ 48 бит)
6)используем перестановку S для правого блока
7)используем перестановку P для правого блока
8)левый блок = (левый блок) XOR (правый блок)
9) поменять местами левый и правый блок(кроме последней итерации)
10)повторить шаги 4-9 16раз
11)склеять блоки в один 64 бит
11)делаем финальную перестановку IP(-1) блока 64

но вот как расшифровать - непонятно. написано, что действия делать в обратном порядке, но как восстанавливать блоки после P и S перестановок - непонятно
понятно только, что ключи нужно применять в обратном порядке.
разжуйте пожалуйста так же пошагово алгоритм расшифровки и гляньте, не допустил ли я ошибку в описанных мной шагах

Последний раз редактировалось sinestro; 06.01.2015 в 02:12.
sinestro вне форума Ответить с цитированием
Старый 06.01.2015, 11:45   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

если память мне не изменяет, то DES это алгоритм у которого в обратной операции только порядкок следования ключей меняется на противоположный, а вся остальная логика такая же как и в прямой операции.
f.hump вне форума Ответить с цитированием
Старый 06.01.2015, 19:48   #3
MaGWaY_minsk
Пользователь
 
Регистрация: 17.10.2008
Сообщений: 35
По умолчанию

Может кто сможет мне немного мозг вправить:
В википедии говориться про начальную перестановку:

Цитата:
По таблице первые 3 бита результирующего блока \mathrm{IP}(T) после начальной перестановки \mathrm{IP} являются битами 58, 50, 42 входного блока T, а его 3 последние бита являются битами 23, 15, 7 входного блока.
ТОесть:
58 -1, 50 - 2, 42-3, 34-4,26-5,18-6,10-7,2-8,
60-9,52-10,44-11....
Я правильно понял порядок перестановки или нет?
MaGWaY_minsk вне форума Ответить с цитированием
Старый 06.01.2015, 21:19   #4
sinestro
Пользователь
 
Регистрация: 24.02.2012
Сообщений: 88
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
если память мне не изменяет, то DES это алгоритм у которого в обратной операции только порядкок следования ключей меняется на противоположный, а вся остальная логика такая же как и в прямой операции.
что-то не похоже. вот к примеру мой код, но расшифровывает он не правильно. где я лоханулся? функции работают правильно. ключи тоже в правильном порядке берутся. сидел вручную биты пересчитывал даже
Код:
private void Crypting(ref BitArray ba64, bool encryption)
        {     
            BitArray leftTextBlock32 = new BitArray(32), rightTextBlock32 = new BitArray(32);
            BitArray extendedTextBlock = new BitArray(48);
            BitArray key64 = new BitArray(key), key56 = new BitArray(56), key48 = new BitArray(48);  
            FirstPerm(ref ba64);
            DivideBlock(ba64, ref leftTextBlock32, ref rightTextBlock32);
            FirstKeyPerm(key64, ref key56);
            for (int i = 0; i < 16; i++)
            {
                if (i == 0 || i == 1 || i == 8 || i == 15)
                {
                    if (!(!encryption && i == 0)) MoveKey(ref key56, encryption, 1);
                }
                else
                    MoveKey(ref key56, encryption, 2);
                
                Get48bitKey(key56, ref key48);  
                ExtendBlock(rightTextBlock32, ref extendedTextBlock);
                extendedTextBlock.Xor(key48);
                Schange(extendedTextBlock, ref rightTextBlock32);
                Pchange(ref rightTextBlock32);
                leftTextBlock32.Xor(rightTextBlock32);
                if (i != 15) SwapParts(ref leftTextBlock32, ref rightTextBlock32);
            }
            MergeBlocks(ref ba64, leftTextBlock32, rightTextBlock32);
            FinalPerm(ref ba64); 
        }

Последний раз редактировалось sinestro; 07.01.2015 в 10:40.
sinestro вне форума Ответить с цитированием
Старый 06.01.2015, 21:28   #5
sinestro
Пользователь
 
Регистрация: 24.02.2012
Сообщений: 88
По умолчанию

MaGWaY_minsk, вот
Код:
public static void FirstPerm(ref BitArray ba)//на вход 64 битный кусок текста
        {
            int[] indexes ={58,	50,	42,	34,	26,	18,	10,	2,	60,	52,	44,	36,	28,	20,	12,	4,
                            62,	54,	46,	38,	30,	22,	14,	6,	64,	56,	48,	40,	32,	24,	16,	8,
                            57,	49,	41,	33,	25,	17,	9,	1,	59,	51,	43,	35,	27,	19,	11,	3,
                            61,	53,	45,	37,	29,	21,	13,    5,	63,	55,	47,	39,	31,	23,	15,	7};

            BitArray temp = new BitArray(ba);
            for (int i = 0; i < 64; i++)
                ba[i] = temp[indexes[i] - 1];
        }
sinestro вне форума Ответить с цитированием
Старый 07.01.2015, 00:10   #6
sinestro
Пользователь
 
Регистрация: 24.02.2012
Сообщений: 88
Вопрос реализация алгоритма DES

помогите пожалуйста найти ошибку. моя программа шифрует, но расшифровывает криво. что может быть не так ? всё делал по схеме с википедии. функции по несколько раз перепроверил. даже биты сидел проверял. вот код
Код:
private void Crypting(ref BitArray ba64, bool encryption)
        {     
            BitArray leftTextBlock32 = new BitArray(32), rightTextBlock32 = new BitArray(32);
            BitArray extendedTextBlock = new BitArray(48);
            BitArray key64 = new BitArray(key), key56 = new BitArray(56), key48 = new BitArray(48);  
            FirstPerm(ref ba64);
            DivideBlock(ba64, ref leftTextBlock32, ref rightTextBlock32);
            FirstKeyPerm(key64, ref key56);
            for (int i = 0; i < 16; i++)
            {
                if (i == 0 || i == 1 || i == 8 || i == 15)
                {
                    if (!(!encryption && i == 0)) MoveKey(ref key56, encryption, 1);
                }
                else
                    MoveKey(ref key56, encryption, 2);
                
                Get48bitKey(key56, ref key48);  
                ExtendBlock(rightTextBlock32, ref extendedTextBlock);
                extendedTextBlock.Xor(key48);
                Schange(extendedTextBlock, ref rightTextBlock32);
                Pchange(ref rightTextBlock32);
                leftTextBlock32.Xor(rightTextBlock32);
                if (i != 15) SwapParts(ref leftTextBlock32, ref rightTextBlock32);
            }
            MergeBlocks(ref ba64, leftTextBlock32, rightTextBlock32);
            FinalPerm(ref ba64); 
        }

Последний раз редактировалось sinestro; 07.01.2015 в 10:40.
sinestro вне форума Ответить с цитированием
Старый 07.01.2015, 15:21   #7
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

сделай поcле каждой строчки проверку - вывод результатов на экран. и смотри. сначала после первой строки выведи. если всё нормально, то сделай вывод после второй строки. в разделе "Безопасность" ты расписал что да как делается. а тут код почти готовый и почти рабочий. проверить-то можно самого себя?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 07.01.2015 в 15:52.
NetSpace на форуме Ответить с цитированием
Старый 07.01.2015, 16:23   #8
sinestro
Пользователь
 
Регистрация: 24.02.2012
Сообщений: 88
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
проверить-то можно самого себя?
уже 2 раза так делал. сделал окно для вывода. сидел побитово считал. с ключами 100% всё нормально. XOR нормальные, индексы перестановок с википедии скопипастил, в S перестановке тоже всё правильно. единственное предположение может быть только в том, что допущена ошибка в самом алгоритме. прилагаю исходники. по нажатию кнопки "шифрование" в правом richtextbox будет выведен весь процесс шифрования и дешифрования сразу. только секунд 10 придёться подождать
Вложения
Тип файла: rar DesGui.rar (57.1 Кб, 9 просмотров)
sinestro вне форума Ответить с цитированием
Старый 07.01.2015, 16:53   #9
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

запускаю программу DesGui, в обоих окнах чисто. нажимаю Шифровать и в правом окне начинается обработка - показывается ход, но окно не прокручивается. жду минуту, а она не заканчивается. щёлкаю мышью по окну, где ход шифровки - зависает программа.
а, нет. 2 минуты считал.
в окне набрал текст 1234567890-= (если это влияет)
расшифрованный текст 01100101111010011111011011100011001 00111011010010101001101011011
с чем его надо сравнить? c исходным?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 07.01.2015 в 16:57.
NetSpace на форуме Ответить с цитированием
Старый 07.01.2015, 16:59   #10
sinestro
Пользователь
 
Регистрация: 24.02.2012
Сообщений: 88
По умолчанию

биты текста находяться в функции button1click
Код:
int []text = {1,0,0,0,1,1,0,0, 1,0,1,0,1,0,0,1 ,1,0,0,1,1,1,0,0,
                             1,1,0,0,1,0,0,0, 1,1,0,0,1,1,0,1, 1,1,0,1,0,1,0,1, 
                             0,1,1,0,1,1,0,0, 1,0,1,1,1,0,0,0 };
sinestro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как зашифровать слово с по алгоритму шифрования DES UrazakovRim Безопасность, Шифрование 12 22.02.2015 18:27
Очень срочно! Алгоритм шифрования DES... Regloger Помощь студентам 15 14.05.2013 17:04
Алгоритм шифрования DES PANDA8 Помощь студентам 1 09.04.2013 11:29
Алгоритм шифрования Alt Помощь студентам 2 18.03.2011 07:26