🧩 Chiffrement par bloc : comprendre AES, DES, Blowfish, Twofish, Serpent et Camellia pour sécuriser ses données

Le chiffrement par bloc – qu’il s’agisse de DESAESBlowfishTwofishSerpent ou Camellia – est la pierre angulaire de la cryptographie symétrique moderne et de la sécurité des données. Ces algorithmes, souvent évoqués mais rarement expliqués, transforment nos informations en blocs d’octets méconnaissables, garantissant confidentialité et intégrité dans tout ce qui touche à la cybersécurité : VPN, TLS, disques chiffrés, bases de données ou IoT.

Mais derrière les acronymes, il y a une vraie histoire d’ingénierie, de mathématiques et de guerres de standards. Entre DES, le vétéran à 56 bits, AES, l’élu du NIST, et leurs cousins oubliés, le monde du chiffrement par bloc ressemble plus à un bar de vieux hackers qu’à un cours de maths. Alors sortons les équations, les S-box, et un brin d’ironie pour revisiter les fondations de la crypto symétrique moderne — sans perdre le sens du fun.

🔲 I. DES — la vieille école

Le Data Encryption Standard (DES), c’est un peu le vinyle de la cryptographie : dépassé, mais culte.
Né dans les labos d’IBM au début des années 1970 (nom de code Lucifer, tout un programme), puis adopté par le NIST en 1977 sous la référence FIPS PUB 46, DES a régné sur les communications sécurisées pendant plus de deux décennies.
Jusqu’au jour où la puissance de calcul moderne lui a mis une claque à 56 bits près.


🧩 Notations utilisées

SymboleSignification
MMessage clair (plaintext)
CTexte chiffré (ciphertext)
KClé secrète (56 bits utiles)
E_K(M)Chiffrement du message M sous clé K
D_K(C)Déchiffrement du texte C sous clé K
\oplusXOR binaire
P(x)Permutation
S_iS-box numéro i
f_K(R_i)Fonction de ronde dépendante de la clé

🧮 Principe général

DES est un chiffrement par bloc symétrique travaillant sur 64 bits.
Chaque bloc passe par une série de transformations — permutations, substitutions, et XOR — articulées autour d’une structure de Feistel en 16 rondes.

L’idée de base :

À chaque ronde, on applique une fonction non linéaire sur la moitié droite du bloc, puis on l’additionne (XOR) à la moitié gauche.
Ensuite, on échange les deux moitiés.
Simple. Élégant. Réversible.

L’opération globale s’écrit :

(L_0, R_0) = \text{IP}(M) L_i = R_{i-1} R_i = L_{i-1} \oplus f_{K_i}(R_{i-1}) \quad \text{pour } i = 1..16 C = \text{IP}^{-1}(R_{16}, L_{16})

où :

  • \text{IP} est la Permutation Initiale,
  • \text{IP}^{-1} est la Permutation Finale (Inverse),
  • f_{K_i} applique une expansion, une substitution via 8 S-boxes, et une permutation.

🔬 Fonction de ronde f_{K_i}(R_{i-1})

C’est le cœur de DES — là où la confusion et la diffusion s’entrechoquent façon Shannon.

  1. Expansion :
    E: R_{i-1}(32 \text{ bits}) \rightarrow 48 \text{ bits}
  2. Mélange avec la clé de ronde :
    B = E(R_{i-1}) \oplus K_i
  3. Substitution via 8 S-boxes :
    S(B) = (S_1(B_1), S_2(B_2), ..., S_8(B_8))
    Chaque S_i réduit 6 bits → 4 bits.
  4. Permutation P :
    f_{K_i}(R_{i-1}) = P(S(B))

🧠 Démonstration mathématique

Le processus complet sur 16 rondes peut être représenté comme une composition de fonctions Feistel :

E_K(M) = IP^{-1} \circ F_{K_{16}} \circ F_{K_{15}} \circ ... \circ F_{K_1} \circ IP(M)

avec

F_{K_i}(L, R) = (R, L \oplus f_{K_i}(R))

Et la propriété magique du réseau de Feistel garantit la réversibilité :
en remplaçant K_i par K_{17-i}, on obtient directement le déchiffrement.


🧨 Limites et héritage

DES a été cassé non pas par défaut mathématique, mais par force brute :
56 bits = 2⁵⁶ ≈ 7,2×10¹⁶ clés → accessible à un cluster dès les années 1990.

C’est ce qui a motivé la création de 3DES puis d’un remplaçant plus moderne : AES.

Mais soyons honnêtes, DES a posé toutes les bases : la structure Feistel, la conception de S-boxes non linéaires, et la notion de diffusion calculée.


📚 Références documentaires

  • FIPS PUB 46-3 – Data Encryption Standard (DES), NIST, 1999
  • RFC 4772 – Security Implications of Using the Data Encryption Standard (DES)
  • IBM Journal of Research and Development, Vol. 19, No. 5, 1975 — Lucifer Cipher Specification
  • NIST Special Publication 800-67 Rev.2, 2017 – Recommendation for the Triple Data Encryption Algorithm (TDEA)

🧊 II. AES — la relève (Rijndael, le monstre élégant)

Quand DES a commencé à suer face aux clusters de brute force, le NIST a lancé un appel d’air en 1997 : il fallait un successeur.
Résultat du concours : Rijndael, développé par Vincent Rijmen et Joan Daemen (Belgique, 1998), sacré en 2001 sous le doux nom de AES – Advanced Encryption Standard (FIPS-197).
Plus moderne, plus mathématique, et surtout taillé pour le hardware comme pour le software.


🧩 Caractéristiques générales

ÉlémentValeur
Taille de bloc128 bits
Taille de clé128, 192 ou 256 bits
StructureSubstitution–Permutation (SPN)
Rounds10, 12 ou 14 selon la clé
OpérationsGalois Field GF(2⁸)
NotationsS(x) : SubBytes, P(x) : ShiftRows, M(x) : MixColumns

AES n’est pas un Feistel. Ici, tout le bloc est transformé à chaque ronde.
La clé change, les bytes dansent, et la sécurité repose sur des mathématiques pures.


🔬 Le cœur d’AES

Chaque ronde (sauf la dernière) applique quatre opérations successives :

  1. SubBytes — substitution non linéaire via une S-box
  2. ShiftRows — décalage des lignes de l’état
  3. MixColumns — transformation linéaire sur chaque colonne
  4. AddRoundKey — XOR avec la clé de ronde

La ronde s’écrit mathématiquement ainsi :Round(State)=M(P(S(State)))⊕KiRound(State)=M(P(S(State)))⊕Ki​

et la ronde finale omet la transformation MixColumns.


🧪 S-box AES complète (valeurs hexadécimales)

Elle est dérivée de l’inverse multiplicatif dans le corps de Galois GF(2⁸) combiné à une transformation affine.

0123456789ABCDEF
0637C777BF26B6FC53001672BFED7AB76
1CA82C97DFA5947F0ADD4A2AF9CA472C0
2B7FD9326363FF7CC34A5E5F171D83115
304C723C31896059A071280E2EB27B275
409832C1A1B6E5AA0523BD6B329E32F84
553D100ED20FCB15B6ACBBE394A4C58CF
6D0EFAAFB434D338545F9027F503C9FA8
751A3408F929D38F5BCB6DA2110FFF3D2
8CD0C13EC5F974417C4A77E3D645D1973
960814FDC222A908846EEB814DE5E0BDB
AE0323A0A4906245CC2D3AC629195E479
BE7C8376D8DD54EA96C56F4EA657AAE08
CBA78252E1CA6B4C6E8DD741F4BBD8B8A
D703EB5664803F60E613557B986C11D9E
EE1F8981169D98E949B1E87E9CE5528DF
F8CA1890DBFE6426841992D0FB054BB16

⚙️ Transformation MixColumns

Chaque colonne de l’état (4 octets) est considérée comme un polynôme sur GF(2⁸), multiplié par une matrice fixe :

Chaque colonne de l’état (4 octets) est considérée comme un polynôme sur GF(2⁸), multiplié par une matrice fixe

où la multiplication s’effectue dans le corps GF(2⁸) avec le polynôme irréductible x^8 + x^4 + x^3 + x + 1.


🧮 Équation générale du chiffrement AES

C=AddRoundKeyNr(SubBytes(ShiftRows(State))) après Nr rondes C=AddRoundKeyNr​(SubBytes(ShiftRows(State))) après Nr rondes

avec
State = M \oplus K_0 initialement, et Nr \in {10, 12, 14}.


🧩 Exemple minimaliste (AES-128, 1ère ronde)

Si le bloc d’entrée est :

M = \text{[32 43 F6 A8 88 5A 30 8D 31 31 98 A2 E0 37 07 34]}
et la clé K_0 = \text{[2B 7E 15 16 28 AE D2 A6 AB F7 97 75 46 09 2E EA]},

alors après la première AddRoundKey :

State_1 = M \oplus K_0 = [19 A0 9A E9 3D F4 C6 F8 E3 E2 8D 48 BE 2B 2A 08]

📚 Références documentaires

  • FIPS PUB 197 – Advanced Encryption Standard (AES), NIST, 2001
  • RFC 3602 – AES-CBC Cipher Algorithm and Block Sizes
  • NIST SP 800-38A – Recommendation for Block Cipher Modes of Operation
  • Daemen & RijmenThe Design of Rijndael, Springer, 2002

🐍 III – Les cousins oubliés : Blowfish, Twofish, Serpent, Camellia

Quand AES a remporté le concours du NIST, une génération entière d’algos s’est retrouvée sur le carreau. Pourtant, ces « perdants magnifiques » ont chacun marqué l’histoire de la crypto symétrique.


🐡 Blowfish (1993, Bruce Schneier)

Le « premier couteau suisse open source » du chiffrement par bloc.

  • Bloc : 64 bits
  • Clé : jusqu’à 448 bits
  • Structure : Feistel à 16 rondes
  • S-boxes : fixées dynamiquement depuis la clé (original à l’époque)

Formule de ronde : Ri=Li−1⊕F(Ri−1,Ki),Li=Ri−1Ri​=Li−1​⊕F(Ri−1​,Ki​),Li​=Ri−1​

Sa fonction F est un bijou de compacité : F(x)=((S1[a]+S2[b])⊕S3[c])+S4[d]F(x)=((S1​[a]+S2​[b])⊕S3​[c])+S4​[d]

Malgré sa robustesse, son bloc trop court (64 bits) l’a rendu vulnérable au birthday bound.
Il a régné dans les années 2000 (PGP, SSH 1.3, OpenBSD) avant d’être relégué par AES et son petit frère Twofish.

Référence : Bruce Schneier – Applied Cryptography, 1996


🐠 Twofish (1998, Bruce Schneier et al.)

Finaliste du concours AES, Twofish est un Feistel hybride à 16 rondes avec blocs de 128 bits.
Il innove avec :

  • des S-boxes paramétrées par la clé,
  • un mélange linéaire appelé MDS matrix,
  • et un pré-blanchiment/post-blanchiment du bloc.

Transformation principale : y=MDS×S(Q(x⊕Ki))y=MDS×S(Q(x⊕Ki​))

Le tout sur GF(2⁸).
Il est élégant, flexible, et reste utilisé dans TrueCrypt/VeraCrypt pour ceux qui aiment chiffrer leurs disques comme en 1999.

Références : Schneier et al., « Twofish : A 128-Bit Block Cipher » (1998)


🐉 Serpent (1998, Anderson, Biham, Knudsen)

L’algorithme des puristes.
Structure SPN (Substitution-Permutation Network) de 32 rondes – paranoïa volontaire.

  • Bloc : 128 bits
  • Clé : jusqu’à 256 bits
  • 8 S-boxes non linéaires inspirées de DES
  • Chaque ronde = Substitution → Permutation → XOR avec clé

Équation : Statei+1=P(S(Statei))⊕KiStatei+1​=P(S(Statei​))⊕Ki​

Serpent était considéré le plus conservateur du concours AES : extrêmement sûr, mais plus lent que Rijndael.
Résultat : la sécurité a perdu face à la performance.

Référence : Anderson, Biham & Knudsen, « Serpent: A New Block Cipher Proposal » (1998)


🌸 Camellia (2000, Mitsubishi & NTT, Japon)

Le plus discret mais le plus adopté en Asie.
Structure Feistel à 18 rondes, bloc 128 bits, clés 128–256 bits.
Particularités :

  • opérations xor/add/sub sur GF(2⁸) et GF(2³²),
  • diffusion rapide via une Matrice FL/FL⁻¹,
  • performances proches d’AES,
  • validé par ISO/IEC 18033-3 et RFC 3713.

Sa fonction principale : F(X,K)=P(S(X⊕K))F(X,K)=P(S(X⊕K))

Camellia est aujourd’hui intégré dans OpenSSLGnuTLS, et le chiffrement TLS/SSH au même titre qu’AES.


⚖️ Comparatif rapide

AlgoBlocCléStructureVitesseStatut
Blowfish64 bits≤ 448 bitsFeistelRapideDéprécié
Twofish128 bits≤ 256 bitsFeistelBonSécurisé
Serpent128 bits≤ 256 bitsSPNLentUltra-sûr
Camellia128 bits≤ 256 bitsFeistelExcellentISO/NIST

🍻 Ce qu’on en retient

Ces algos, souvent éclipsés par AES, continuent d’exister dans les stacks modernes :

  • Blowfish → OpenSSH Legacy
  • Twofish → VeraCrypt, GnuPG
  • Serpent → VeraCrypt, OpenSSL (optionnelle)
  • Camellia → TLS 1.2 / 1.3 (OpenSSL, Botan, mbedTLS)

Leur étude reste précieuse : ils incarnent les différentes philosophies de conception avant l’ère AES – le pragmatisme (Blowfish), la flexibilité (Twofish), la rigueur absolue (Serpent), et l’équilibre industriel (Camellia).


⚙️ IV – Conclusion : la vie quotidienne des blocs (OpenSSL, Botan, mbedTLS, & co)

Ce qu’il faut retenir ?
Le chiffrement par bloc n’est pas qu’un sujet de thèse : il tourne partout, tout le temps — dans ton navigateur, ton VPN, ton disque chiffré, ton smartphone et même ton badge d’accès.
Et sous le capot, ce sont les bibliothèques open source qui tiennent la baraque.


🧰 Les briques logicielles

  • OpenSSL : la référence historique, implémente AES, 3DES, Camellia, Blowfish, Twofish, et même IDEA pour les nostalgiques.
    Optimisé en assembleur, il exploite les instructions AES-NI des CPU modernes.
    Exemple :openssl enc -aes-256-cbc -in secret.txt -out secret.enc -k mykey
  • mbedTLS : la version allégée pour embarqués (routeurs, IoT).
    Entièrement en C, conçue pour compiler sans OS et sans malloc() :
    AES, Camellia et DES restent présents, mais l’empreinte mémoire est minimale.
  • Botan : élégance C++ moderne, haut niveau d’abstraction, et support d’à peu près tout ce que les chercheurs ont pondu depuis 1995.
    Intègre AES, Serpent, Twofish, Camellia, et même ARIA.
    Parfait pour écrire des outils crypto clean et documentés.
  • libsodium : l’enfant rebelle de la bande — pas de AES par défaut (trop complexe à utiliser correctement), mais des primitives sûres comme XChaCha20 et Poly1305.
    Le mot d’ordre : “secure by design”.

🔒 Les modes d’opération : CBC, CTR, GCM

Les bibliothèques n’implémentent pas seulement les algos bruts : elles gèrent aussi le mode d’enchaînement des blocs.
Chaque mode change profondément le comportement du chiffrement.

  • CBC (Cipher Block Chaining) : classique, nécessite un IV aléatoire.
    C_i = E_K(M_i \oplus C_{i-1})
  • CTR (Counter Mode) : transforme un bloc en flux pseudo-aléatoire.
    C_i = M_i \oplus E_K(\text{nonce} | \text{compteur})
  • GCM (Galois Counter Mode) : combine CTR + authentification (MAC).
    C_i = M_i \oplus E_K(\text{nonce} | i), \quad \text{Tag} = H(C, A)

Aujourd’hui, AES-GCM est devenu le standard de facto pour HTTPS, SSH et IPsec : rapide, sûr et matériellement accéléré.


🧠 Ce que la crypto moderne a retenu

  1. DES nous a appris la beauté du Feistel.
  2. AES nous a rappelé que les mathématiques finissent toujours par gagner.
  3. TwofishSerpent et Camellia ont montré que la sécurité, c’est aussi une question de philosophie : performance, prudence ou élégance.
  4. Et les implémentations open source ont prouvé que la transparence est une forme de sécurité.

🔮 Et maintenant ?

La prochaine frontière ?
Les chiffrements post-quantiques et les modes authentifiés universels.
Mais les bonnes vieilles équations restent les mêmes :

C = E_K(M)

et

M = D_K(C)

… aussi intemporelles qu’une bière tiède en fin de conf crypto 🍺.


📚 Références complémentaires

🧩 Chiffrement par bloc : comprendre AES, DES, Blowfish, Twofish, Serpent et Camellia pour sécuriser ses données
Partager cet article : Twitter LinkedIn WhatsApp

🖋️ Publié sur SecuSlice.com

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut