Код (Text): void desfunc(register unsigned long int *block, register unsigned long int *keys) { register unsigned long int fval, work, right, leftt; register int round; leftt = block[0]; right = block[1]; work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL; right ^= work; leftt ^= (work << 4); work = ((leftt >> 16) ^ right) & 0x0000ffffL; right ^= work; leftt ^= (work << 16); work = ((right >> 2) ^ leftt) & 0x33333333L; leftt ^= work; right ^= (work << 2); work = ((right >> 8) ^ leftt) & 0x00ff00ffL; leftt ^= work; right ^= (work << 8); right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL; work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL; это фрагмент из Брюса Шнайдера "Прикладная криптография" это описание начала функции дес, дальше идет работа с s блоками. Так вот по идее в приведенном коде должны быть "начальная перестановка" "перестановка с расширением". Как-то все у них хитро получается, не могу понять как это тут перестановка делается? Кто может помочь написать пояснения к коду?
blocks[0] = 0x01234567 blocks[1] = 0x89ABCDEF и посмотреть результат выполненной процедуры. станет понятно что куда перестанавливается. здесь только начальная перестановка(initial permutation)