Albert Nadal Garriga Observacions d'un Lleidatà Cerverí. Enginyer informàtic. Emprenedor idealista. Catalanista enfeinat.

blowfish_header
Algorisme de xifratge simètric Blowfish

Blowfish és un algorisme de xifratge de blocs de 64 bits amb un tamany variable de la clau. L’algorisme consisteix en dos parts, la primera s’encarrega d’expandir la clau i la segona xifra les dades. El procés d’expansió de la clau converteix la clau en diferents subclaus. El xifratge de les dades consisteix en interar 16 vegades la funció de xifratge. Cada ronda consteix en una permutació amb dependència de la clau, i una substitució amb dependència de la clau i de les dades. Les operacions consisteixen en sumes i operacions XOR sobre paraules de 32 bits.

La meva implementació en C++ d’aquest algorisme data de l’any 2003 i es pot descarregar prement aquí. Per usar-lo primer cal compilar-lo amb un compilador de C++ com el G++. No hi ha un makefile, doncs cal compilar i linkar els fitxers manualment de la següent manera:

g++ -Wno-deprecated -c blowfish.cpp
g++ -c xifrar_fitxer.cpp
g++ -o xifrar_fitxer xifrar_fitxer.o blowfish.o

Per xifrar un fitxer cal fer-ho de la següent manera:

./xifrar_fitxer -x fitxer_clar fitxer_xifrat

A continuació demanarà una contrassenya. Un cop introduïda començarà el xifratge. Per poder desxifrar un fitxer cal fer-ho utilitzant la mateixa contrassenya en què va sér xifrat. Caldrà fer-ho de la següent manera:

./xifrar_fitxer -d fitxer_xifrat fitxer_clar

Blowfish usa un llarg nombre de subclaus. Aquestes claus han de sér precomputades abans de qualsevol xifratge o desxifratge. El vector P consisteix en 18 subclaus de 32 bits. S’usen quatre S-boxes amb 256 valors de 32 bits cada una. Blowfish és una xarxa Feistel consistent en 16 rondes iterades. L’entrada de l’algorisme és un bloc x de 64 bits.
El procés per encriptar és el següent:

Dividir x en dos parts de 32 bits: xL i xR
For i = 1 to 16
{
          xL = xL XOR P[i]
          xR = F(xL) XOR xR
          Intercanviar xL i xR
}
Intercanviar xL i xR (Desfer l’últim intercanvi)
xR = xR XOR P[17]
xL = xL XOR P[18]
Recombinar xL i xR

La funció F (funció Feistel) es mostra a continuació:

Dividir xL en quatre parts de vuit bits: a, b, c i d
F(xL) = (((S1[a]+S2[b]) XOR S3[c]) + S4[d])

El desxifratge és fa exactament igual que el xifratge, excepte que P[1], P[2], … ,P[18] són usats en ordre invers.
La generació de les subclaus es realitza inicialitzant primer de tot el vector P i les quatre S-Boxes, ordenadament, amb una cadena de caràcters fixada. Aquesta cadena consisteix en els dígits del valor pi(excepte el tres inicial) en hexadecimal: P[1] = 0x243f6a88, P[2] = 0x85a308d3, P[3] = 0x13198a2e, etc… Després s’ha de fer una operació XOR de P[1] amb els primers 32 bits de la clau, després fer una operació XOR de P[2] amb els següents 32 bits de la clau, i així amb tota la resta d’elements del vector P i de la clau.
En aquesta implementació he tingut en compte el tamany de la clau, és a dir, si la longitud de la clau és menor que el nombre d’elements del vector P, aleshores es continua fent el mateix procés actualizant la resta de valors del vector P amb la clau.

El mètode XifrarText(char text[], int longitud) xifra un fragment de memòria. El xifratge s’efectua en blocs de 8 bytes, d’aquesta manera s’ha d’aplicar l’algorisme de xifratge a cada bloc. El resultat de xifrar un bloc genera un altre bloc xifrat de 8 bytes en un altre fragment de memòria. El fragment de memòria que ha de contenir les dades xifrades haurà de sér múltiple de vuit, això no implica que el fragment que es vol xifrar també ho hagi de sér.

DesxifrarText(char text[], int longitud, int NoHiHaGuarnicio) desxifra un fragment un fragment de memòria de longitud fixada. El desxifratge també s’efectua en blocs de 8 bytes, d’aquesta manera s’ha d’aplicar l’algorisme de desxifratge descrit a cada bloc. El resultat de desxifrar un bloc genera un altre bloc de 8 bytes amb les dades en clar que s’afegeixen a un fragment de memòria generat dinàmicament. El fragment de memòria que ha de contenir les dades desxifrades ha de tenir la mateixa longitud que el text original en clar, per fer possible això s’han d’eliminar les dades de farciment inserides al final. El farciment només s’usa quan el text que es vol xifrar no és múltiple de vuit i té la principal funcionalitat d’indicar el final de les dades en clar.

Al moment de xifrar es xifra bloc a bloc fins a arrivar a l’últim bloc del fragment. En aquest últim bloc en clar, s’insereix la suma en mòdul 255 dels últims bytes del missatge, al següent byte, just després de l’últim caràcter del missatge. La resta de bytes del bloc contenen valors aleatòris que no són la suma en mòdul 255 dels primers bytes. Finalment es xifra el bloc.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>