Проблема с поднятой битами в Haskell

как часть школьного проекта, я реализую некоторые криптографические алгоритмы в Haskell. Как вы, наверное, знаете, это связано довольно много низкого уровня. Теперь я застрял на одной конкретной подпрограмме, которая заставляет меня головную боль. Рутина, которая представляет собой перестановку на 256 битах, работает следующим образом:

Вход: 256 битовый блок.
Затем все даже пронумерованные биты (0,2, ...) в входном блоке принимаются для первых 128 битов в выходном блоке. Хотя нечетные биты принимаются, чтобы быть 128 последних битов в выходном блоке. Более конкретно, формула для бита в выходе в выходе приведена как (A I - это IT в входном блоке, и B - это выход):

B I = A 2i

B I + 2 D-1 = A 2i + 1

Для I I от 0 до 2 D-1 -1, d = 8.

в качестве примера игрушки, предположим, что мы использовали снижение версии процедуры, которая работала с 16 битными блоками вместо 256 битов. Затем следующая битовая битоница будет разрешена следующим образом:

1010 1010 1010 1010 -> 1111 1111 0000 0000

Я не смог придумать чистую реализацию для этой функции. В частности, я пытался с бассейном -> Bytestring подписью, но такого рода заставляет меня работать на Word8 вид зернистости. Но каждый байт в выходе ByteString является функцией битов во всех других байтах, которые требуют некоторых действительно грязных операций.

Я буду очень благодарен за любой намек или совет о том, как приблизиться к этой проблеме.

5
задан hakoja 4 September 2011 в 00:34
поделиться