// один шаг алгоритма DES // суть: // left[i] = right[i - 1] // right[i] = left[i - 1] ^ F( right[i - 1], key[i] ) // весь прикол в: // перестановке right с расширением // подстановках в 8 S-блоках // перестановках в P-блоке // и не забыть поксорить нужные блоки // это при том, что на вход подается уже сгенерированный очередной ключ void DESCoder::_makeDesStep(vecUnsChar iKey) { // перестановка right с расширением // часто называемая expansion // расширяем 32-битный _right до 48 бит vecUnsChar right48 = _expansion(); // теперь необходимо поксорить полученный 48-битный блок // с 48-битным ключом for (int i = 0; i < 48; i++) right48[i] = right48[i] ^ iKey[i]; // теперь самая интересная часть: S-блоки // Подстановка с помощью S-блоков является ключевым этапом DES // Другие действия алгоритма линейны и легко поддаются анализу // S-блоки нелинейны, и именно они в большей степень определяют безопасность алгоритма // На вход S-блоков поступает 48-битный right48 (уже поксореный с ключом), // на выходе - 32-битный блок right32 vecUnsChar right32 = _substitution(right48); // после этого полученный блок подвергается очередной перестановке right32 = _permutation(right32); // после этого он ксорится с левым блоком for (int i = 0; i < 32; i++) right32[i] = right32[i] ^ _left[i]; // при этом новый левый блок - старый правый _left = _right; // а правый - результат работы этих страшных функций _right = right32; // на этом шаг алгоритма DES заканчивается }
int permutation(permu *p){ while(!(p->overflow)){ _geninversetable(p); _permutation(p); print_1array(p->permutation,p->length); } return 1; }