| Fiche technique | |
|---|---|
| Nom : | Blowfish |
| Type de produit : | Cryptographie |
| Auteur : | Bruce Schneier |
| Date de publication : | 1993 |
Blowfish
L'algorithme Blowfish est un système de chiffrement symétrique conçu par Bruce Schneier en 1993 pour offrir une alternative gratuite et sécurisée aux algorithmes propriétaires tels que DES. Il repose sur une structure de type réseau de Feistel, composée de 16 tours successifs qui transforment les blocs de données en fonction d'une clé secrète. Blowfish utilise des blocs de 64 bits, ce qui signifie que les données sont traitées par segments de 8 octets. Sa clé peut varier en taille entre 32 bits et 448 bits, offrant une grande flexibilité en matière de sécurité selon les besoins de l'application. Dès son introduction, Blowfish a été largement apprécié pour sa rapidité d'exécution, particulièrement dans les environnements où la mémoire et la puissance de calcul sont limitées.
Le fonctionnement de Blowfish repose sur deux grandes étapes : l'expansion de la clef et le processus de chiffrement/déchiffrement. L'expansion de la clef est une étape essentielle où la clef fournie est transformée en un ensemble de sous-clefs (appelées P-array et S-boxes) qui serviront à chaque tour du chiffrement. Ce mécanisme assure que chaque bit de la clef influence le résultat final de manière complexe, ce qui renforce la résistance contre les attaques par cryptanalyse. Ensuite, lors du chiffrement, chaque bloc de 64 bits subit une série d'opérations de permutation et de substitution contrôlées par ces sous-clefs, garantissant un haut niveau de diffusion et de confusion. Ainsi, une modification minime dans le texte clair ou la clef entraîne un résultat complètement différent, ce qui renforce la sécurité.
Blowfish est reconnu pour sa rapidité et sa robustesse, mais il présente aussi certaines limites. Sa taille de bloc de 64 bits, étant suffisante au moment de sa création, est aujourd'hui considérée comme relativement faible face aux standards modernes comme l'AES, utilisant des blocs de 128 bits. Cela peut rendre Blowfish vulnérable à certaines attaques lorsque de grandes quantités de données sont chiffrées avec la même clef. Toutefois, dans des contextes spécifiques comme les systèmes embarqués, les anciens logiciels de sécurité ou certaines applications réseau, Blowfish reste un choix pertinent en raison de sa simplicité et de son efficacité. Il a également inspiré d'autres algorithmes, notamment Twofish, conçu comme son successeur et proposé lors du concours pour le standard AES.
|
MODULE f(x) * Calcule une fonction f sur une entrée x de 32 bits, en utilisant des boîtes S et une manipulation de bits high_byte ← (x décalage vers la droite par 24 bits) second_byte ← (x décalage vers la droite par 16 bits) ∧ FFh third_byte ← (x décalage vers la droite par 8 bits) ∧ FFh low_byte ← x ∧ FFh h ← S[0][high_byte] + S[1][second_byte] RETOURNER (h XOR S[2][third_byte]) + S[3][low_byte] MODULE blowfish_encrypt(L, R) * Chiffre deux moitiés de 32 bits L et R à l'aide du tableau P et de la fonction f sur 16 tours BOUCLE POUR round ← 0 JUSQU'A 15 FAIRE L ← L XOR P[round] R ← f(L) XOR R ECHANGER L et R FIN BOUCLE POUR ECHANGER L et R R ← R XOR P[16] L ← L XOR P[17] MODULE blowfish_decrypt(L, R) * Décrypte deux moitiés de 32 bits L et R en utilisant le tableau P et la fonction f sur 16 tours en sens inverse BOUCLE POUR round ← 17 JUSQU'A 2 FAIRE L ← L XOR P[round] R ← f(L) XOR R ECHANGER L et R FIN BOUCLE POUR ECHANGER L et R R ← R XOR P[1] L ← L XOR P[0] * Initialise le tableau P et les boîtes S à l'aide de la clef fournie, puis développe la clef. * Initialise le tableau P avec les valeurs de la clef. key_position ← 0 BOUCLE POUR i ← 0 JUSQU'A 17 FAIRE k ← 0 BOUCLE POUR j ← 0 JUSQU'A 3 FAIRE k ← (k décalage vers la droite par 8 bits) ∨ key[key_position] key_position ← (key_position + 1) mod key_length FIN BOUCLE POUR P[i] ← P[i] XOR k FIN BOUCLE POUR * Extension de clef Blowfish (521 itérations) L ← 0, R ← 0 BOUCLE POUR i ← 0 JUSQU'A 17 SAUT 2 FAIRE blowfish_encrypt(L, R) P[i] ← L P[i + 1] ← R FIN BOUCLE POUR * Remplissez les cases S en cryptant L et R BOUCLE POUR i ← 0 JUSQU'A 3 FAIRE BOUCLE POUR j ← 0 JUSQU'A 255 SAUT 2 FAIRE blowfish_encrypt(L, R) S[i][j] ← L S[i][j + 1] ← R FIN BOUCLE POUR FIN BOUCLE POUR |