Beispiel #1
0
// один шаг алгоритма 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 заканчивается
}
Beispiel #2
0
int permutation(permu *p){
    while(!(p->overflow)){
        _geninversetable(p);
        _permutation(p);
        print_1array(p->permutation,p->length);
    }
    return 1;
}