2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Алгоритм DES
Сообщение03.12.2013, 14:59 


01/06/11
35
Ребята! Есть проблема с расшифровкой данных по алгоритму DES. Есть верно работающий алгоритм шифрования, а вот реализовать обратный что-то не получается.

Во всех источниках пишут, что для расшифровки необходимо просто подавать ключи в обратном порядке, но у меня чего-то не выходит так. Т.е , я пишу
CKey::KeyShift(key, KeyRotation[15-i]);
вместо
CKey::KeyShift(key, KeyRotation[i]);
и желаемый результат не получаю

Код для шифрования:

код: [ скачать ] [ спрятать ]
Используется синтаксис C
<div class="codetitle"><b>Код:</b></div><div class="codecontent">int i;

unsigned char key[7]; //Ключ без битов четности
unsigned char Left1[4];
unsigned char Left[4];
unsigned char byte6key[6];
unsigned char right[4];
unsigned char right_extended[6];


Permute(key, i_key, KeyPermuteMap, 7);
Permute(data, NULL, InitialPermuteMap, 8);

// Шифрование выполняется в 16 раундах

for (i = 0; i < 16; i++)
{
// data[4..8] - правая часть
for (int i = 0; i < 4; i++) Left1[i] = data[i+4];
//взяли левую часть из правой
CKey::KeyShift(key, KeyRotation[i]);
Permute(byte6key, key, KeyFinalCompression, 6);

for (int i = 0; i < 4; i++) right[i] = data[i + 4];

//функция f
Permute(right_extended, right, DataExpansion, 6); //перестановка E

for (int k = 0; k < 6; ++k) right_extended[k] ^= byte6key[k]; //xor с ключом

sbox(right, right_extended); //S-box преобразование

Permute(right, NULL, PBox, 4); //P-box перестановка

//xor результата f и левой части
for (int k = 0; k < 4; ++k) right[k] ^= data[k]; //xor


for (int i = 0; i < 4; i++) data[i] = Left1[i];

for (int i = 0; i < 4; i++) data[i + 4] = right[i];

}

for (int i = 0; i < 4; i++) Left1[i] = data[i]; //скопирвали левую часть
for (int i = 0; i < 4; i++) data[i] = data[i+4]; //поменяли местами левую и правую
for (int i = 0; i < 4; i++) data[i+4] = Left1[i]; //вернули левую часть на место


CKey::Permute(data, NULL, FinalPermuteMap, 8);

}</div>

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Модераторы: Karan, PAV, Toucan, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group