Vous pensez pouvoir recoder la crypto ? Amis dĂ©veloppeurs, parlons franchement. Vous ĂȘtes talentueux, vous codez des applis qui tournent, vous optimisez des boucles Ă coups de cafĂ©ine et vous faites tenir des API avec du scotch et des promesses. Mais il y a un domaine oĂč votre crĂ©ativitĂ© nâest pas la bienvenue : la cryptographie maison.
Oui, toi qui penses : « je vais coder mon propre AES en PHP, ça sera plus lĂ©ger que la lib OpenSSL »âŠÂ Spoiler alert : tu viens dâĂ©crire la prochaine CVE.
đ« Pourquoi « recoder la crypto » est une mauvaise idĂ©e
La cryptographie, ce nâest pas comme refaire un bouton CSS ou un algorithme de tri. Ce nâest pas juste « quelques maths et un peu de logique ».
Les algorithmes modernes sont conçus par des Ă©quipes entiĂšres de chercheurs, testĂ©s pendant des annĂ©es, et validĂ©s par la communautĂ© scientifique. Si tu penses pouvoir reproduire ça en un week-end avec Stack Overflow et trois tutos Medium, jâai une mauvaise nouvelle : tu viens de rĂ©inventer une passoire.
Exemple concret :
- En 2013, un dĂ©veloppeur a créé une librairie JavaScript maison pour gĂ©nĂ©rer des nombres alĂ©atoires. Manque de bol : ses nombres nâĂ©taient pas alĂ©atoires du tout. RĂ©sultat : clĂ©s prĂ©dictibles, systĂšme cassĂ©.
- Autre perle : certains devs stockent des mots de passe avecÂ
md5($password.$salt). Résultat : rainbow tables toujours efficaces, attaques trivialement possibles.
MoralitĂ© : la crypto maison, câest comme un avion en carton. Ăa peut voler deux secondes, mais ça finit toujours par se crasher.
đ Les bibliothĂšques Ă©prouvĂ©es : vos meilleures amies
Heureusement, vous nâavez pas Ă coder tout ça vous-mĂȘmes. Il existe des bibliothĂšques solides, maintenues, auditĂ©es et testĂ©es :
- OpenSSL : la référence pour C/C++, largement utilisée dans TLS/HTTPS.
- libsodium : moderne, simple Ă utiliser, intĂšgre directement les bons choix par dĂ©faut. Disponible pour de nombreux langages (PHP, Python, Node.js, GoâŠ).
- BouncyCastle : incontournable dans lâĂ©cosystĂšme Java.
- NaCl (Networking and Cryptography Library) et ses implémentations (libsodium en est un dérivé).
- Microsoft CNG et les API .NET intégrées.
Ces bibliothĂšques ne sont pas seulement « pratiques », elles sont maintenues par des experts. Quand une faille comme Heartbleed survient, elles sont patchĂ©es rapidement. Si vous aviez Ă©crit votre propre chiffrement en 2012, croyez-moi, vous nâauriez mĂȘme pas vu passer le bug.
đ§© Les erreurs classiques des devs
MĂȘme quand ils utilisent la bonne lib, beaucoup de dĂ©veloppeurs rĂ©ussissent encore Ă tout casser. Voici un florilĂšge :
- Mode ECB dâAES
Exemple dâhorreur classique :openssl_encrypt($plaintext, 'aes-128-ecb', $key);RĂ©sultat ? Une jolie fuite dâinformation, car ECB chiffre chaque bloc de maniĂšre indĂ©pendante. Si tu chiffrages une image, tu obtiens⊠lâimage chiffrĂ©e mais reconnaissable (Google « penguin AES ECB » pour traumatiser tes yeux). - IV fixe ou rĂ©utilisĂ©
LâIV (vecteur dâinitialisation) doit ĂȘtre alĂ©atoire et unique par chiffrement. Le fixer Ă Â00000000 est une hĂ©rĂ©sie. Pourtant, on trouve encore ça dans le code source dâapplis bancaires. - Random non sĂ©curisĂ©
UtiliserÂrand() pour gĂ©nĂ©rer une clĂ© ? SĂ©rieusement ? Câest comme sĂ©curiser une porte blindĂ©e avec un cadenas de vĂ©lo.
đ UtilisezÂrandom_bytes() en PHP,ÂSecureRandom en Java, ou les Ă©quivalents fournis par vos libs. - Rejouer les erreurs du passĂ©
Certains dĂ©veloppeurs adorent mĂ©langer hash et chiffrement : « tiens, je vais hasher la clĂ© avec SHA-1 et ensuite chiffrer avec AES en ECB ». Bravo, tu viens dâinventer un mĂ©canisme que personne ne comprend et qui se casse en deux minutes.
đčïž Exemple pĂ©dagogique : faire simple et solide
Prenons un cas concret en PHP avec libsodium, intégrée depuis PHP 7.2 :
Mauvais code (crypto maison, Ă fuir) :
function myEncrypt($data, $key) {
return base64_encode(openssl_encrypt($data, 'aes-128-ecb', $key));
}
ProblÚmes : mode ECB, gestion des clés bidon, aucune authentification, bref⊠une catastrophe.
Bon code (libsodium) :
$key = sodium_crypto_secretbox_keygen(); $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); $ciphertext = sodium_crypto_secretbox($message, $nonce, $key); // Déchiffrement $plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
- Algorithme solide (XSalsa20-Poly1305).
- Nonce aléatoire.
- Authentification intégrée.
- Pas besoin de choisir un mode : câest sĂ©curisĂ© par dĂ©faut.
đ Anecdotes croustillantes
- Sony PlayStation 3 (2010) : la console a été hackée parce que les devs ont réutilisé une valeur aléatoire fixe pour signer le firmware. Résultat : les hackers ont pu générer leurs propres signatures valides.
- Appli bancaire en 2018 : chiffrement maison basé sur XOR et une clé fixe⊠découverte en clair dans le code source. Résultat : toutes les données clients exposées.
- Start-up blockchain : crypto maison « pour aller plus vite ». RĂ©sultat : vol de plusieurs millions parce que lâimplĂ©mentation de lâECDSA Ă©tait cassĂ©e.
MoralitĂ© : la crypto maison coĂ»te toujours plus cher que dâutiliser une bibliothĂšque Ă©prouvĂ©e.
đ§š Les 3 rĂšgles dâor pour les devs
- Nâinventez rien. Utilisez une lib reconnue.
- Ne choisissez pas les algos vous-mĂȘmes. Fiez-vous aux recommandations (NIST, OWASP, ANSSI, ENISA).
- Paranoïa utile. Si vous trouvez que votre code crypto est « ingénieux », relisez la rÚgle n°1.
â Conclusion : faites confiance aux experts
Coder sa propre crypto, câest comme bricoler son propre airbag avec des ballons de baudruche. Ăa donne une illusion de sĂ©curitĂ©, jusquâau crash.
En 2025, il existe des bibliothĂšques matures, sĂ»res, documentĂ©es, disponibles dans tous les langages. Vous nâavez aucune excuse pour jouer aux apprentis sorciers.
Alors, la prochaine fois que vous sentez lâenvie de taper function myAES() { ... }, faites une pause, respirez, et tapez plutĂŽt composer require paragonie/sodium_compat. Votre futur vous remerciera.
