Come parte di un progetto scolastico sto implementando alcuni algoritmi crittografici in Haskell. Come probabilmente saprai, questo comporta un bel po 'di giochetti di basso livello. Ora sono bloccato su una particolare routine secondaria che mi provoca mal di testa. La routine, che è una permutazione su 256 bit, funziona come segue:Problema con lo scambio di bit in Haskell
Input: un blocco a 256 bit.
Quindi tutti i bit con numero pari (0,2, ...) nel blocco di input sono considerati i primi 128 bit nel blocco di uscita. Mentre i bit con numeri dispari sono considerati come gli ultimi 128 bit nel blocco di uscita. Più specificamente, la formula per la -esimo bit nella uscita è data come (a i è il -esima bit nel blocco d'ingresso, e b è l'uscita):
b i = a 2i
b i + 2 d-1 = a 2i + 1
per i da 0 a 2 d-1 -1, d = 8.
Come esempio giocattolo, supponiamo abbiamo usato una versione ridotta della routine che ha lavorato con 16 blocchi di bit anziché 256 bit. Poi il seguente bitstring sarebbe permutata come segue:
1010 1010 1010 1010 -> 1111 1111 0000 0000
non sono stato in grado di trovare un'implementazione pulita per questo funzione. In particolare, ho provato con una firma ByteString -> ByteString, ma questo mi costringe a lavorare su un tipo di granularità di Word8. Ma ogni byte nell'outtestring dell'output è una funzione di bit in tutti gli altri byte, che richiede alcune operazioni davvero disordinate.
Sarò davvero grato per qualsiasi tipo di suggerimento o consiglio su come affrontare questo problema.
http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Bits.html#t:Bits –