2014 dxdy logo

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

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




 
 Алгоритм DES
Сообщение03.12.2013, 14:59 
Ребята! Есть проблема с расшифровкой данных по алгоритму 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 сообщение ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group