Cet article est une introduction succincte à la cryptographie en vue d’acquérir quelques notions pour réaliser une application de chiffrement de fichiers. Notre ambition est de nous doter d’un outil personnel (mais on ne va pas faire n’importe quoi !) pour garantir la confidentialité de nos données : « DIY your own crypto app ».

Commençons par un peu d’histoire.

Histoire

Le premier document remonterait à l’antiquité (16-ème av JC ). Un artisan aurait écrit sa recette en retirant les consonnes. Somme toute sommaire, son utilisation est claire. Il y a une volonté de dissimuler de l’information aux personnes ne connaissant pas le code. Mais il va falloir attendre un peu pour voir apparaitre un vrai système cryptographique, digne de ce nom, qui est encore utilisé de nos jours. Pendant ce temps une autre pratique va émerger et perdurer jusqu’à notre ère. La stéganographie ou l’art de dissimuler l’information. Cette pratique permet de cacher un texte dans un autre qui est compréhensible et sensé. Un exemple célèbre, reste la supposée correspondance entre George Sand et André de Musset (acrostiche). Ce procédé était aussi utilisé dans l’antiquité. Il faut attendre le carré de Polype et par la suite le code de César pour commencer à parler de cryptographie. A cette époque, l’algorithme peut être connu mais, n’ayant pas la clé, le message reste illisible. Et c’est bien la base de la cryptographie telle qu’on la connait aujourd’hui. Souvent utilisée dans le cadre militaire, sa popularisation s’accentuera avec les communications modernes. De nos jours, l’usage de la cryptographie en France est libre mais certains usages sont soumis à règlementation  (Sécurité, secret et légalité | Agence nationale de la sécurité des systèmes d’information (ssi.gouv.fr)). Avec PGP de Phil Zimmerman, une nouvelle dimension est apparue, plus citoyenne, l’affirmation, nous sommes propriétaires de nos échanges et nos données et par conséquent la cryptographie est un moyen d’en garder le contrôle.

(Histoire de la cryptologie — Wikipédia (wikipedia.org))

La cryptanalyse

Avant d’approfondir la cryptographie, parlons de la branche opposée, la cryptanalyse. La cryptanalyse est la technique qui consiste à déduire un texte en clair d’un texte chiffré sans posséder la clé de déchiffrement. Rien de magique, une des méthodes les plus simples se base sur la connaissance de la langue utilisée dans le texte en clair. On l’appelle l’analyse fréquentielle. Cette méthode est généralement peu efficace avec les algorithmes modernes. Dans notre cas, nous allons prendre en compte une technique simple dite de force brute : la recherche par dictionnaire, qui n’est pas à proprement parlé de la cryptanalyse, mais reste efficace de nos jours. Avec une bonne puissance de calcul, l’essai exhaustif de toutes les clés possibles, associé à de la statistique, est une attaque réaliste.  (Cryptanalyse — Wikipédia (wikipedia.org))

Les défis auxquels la cryptographie moderne doit répondre

La cryptographie peut garantir 4 propriétés essentielles à la sécurité.

  • Confidentialité
    • Rendre un message illisible pour les personnes non autorisées
  • Intégrité
    • Vérifier que le message n’a pas été modifié par un tiers.
  • Authentification
    • Vérifier que l’émetteur du message est bien celui qu’on attend.
  • Non répudiation
    • Garantir que l’émetteur du message ne pourra pas nier avoir émis le message dans le futur

Suivant les cas d’utilisation toutes ne sont pas nécessaires. Pour notre sujet nous allons n’en utiliser qu’une seule.

Avant d’approfondir ces primitives cryptographiques, il faut aborder rapidement la cryptanalyse.

Les primitives cryptographiques

Pour chaque contrainte évoquée ci-dessus, nous avons un ensemble de fonctions répondant au besoin, par exemple :

  • Confidentialité
    • Algorithme de chiffrement symétrique, qui implique un partage de secret, i.e. la clé qui a le rôle de chiffrer et de déchiffrer.
      • Chiffrement par bloc, découpe le texte en blocs de même taille, nécessite un bourrage d’octets (« padding ») pour le dernier bloc
      • Chiffrement par flux, se base sur le principe du masque jetable, pour effectuer un XOR octet par octet.
    • Algorithme de chiffrement asymétrique, qui s’appuie sur deux clés, une dite publique diffusable à tous permettant de chiffrer, l’autre privée servant à déchiffrer les messages chiffrés par la clé publique.
  • Intégrité
    • Empreinte numérique par hachage à sens unique. La comparaison du Hash original avec le contenu reçu indique s’il a été modifié
  • Authentification
    • Authentification du message avec secret
      • HMAC, CMAC,
  • Non répudiation
    • Certificat numérique
      • RSA, ECDSA

Voir les compétitions des primitives cryptographiques.

Générateur de nombres aléatoires

Un RNG (Random Number Generator) est dans ce cadre un outil important qu’il ne faut pas négliger. L’utilisation d’un RNG dans une primitive cryptographique doit garantir les propriétés suivantes : non déterminisme, non prédictibilité. Pour le coup celui de .NET est réputé être bon. Il utilise en interne BCrypt.

Un RNG sera surtout utilisé pour générer des clés, des Salts ou des Iv (vecteur d’initialisation). Les termes de Salt et d’ Iv se rejoignent sur plusieurs points. Ils ont comme utilité d’ajouter un caractère aléatoire au résultat : par exemple si on chiffre deux fois le même fichier, nous aurons deux résultats chiffrés différents. Il est évident que un Salt/Iv ne doit être utilisé qu’une fois et doit aussi être aléatoire pour cela. Ce sont des données non critiques, qu’on peut stocker en clair sur disque.

.Net/C# dans tout ca ?

Dans le Framework .Net, sous l’espace de nom System.Security.Cryptography nous retrouvons une implémentation de toutes les primitives cryptographiques évoquées plus haut. Je vous invite à lire la documentation de Microsoft sur le sujet et le site d’un ancien SoftFluentee. Dans le prochain article , nous réaliserons une première implémentation de notre chiffrement de fichiers avec exclusivement .NET.

Et la suite

Avec ces connaissances nous pourrons nous lancer dans la réalisation de notre application. Avant de se lancer dans le code, nous allons voir ensemble l’organisation des primitives cryptographiques choisies, expliquer nos choix et définir les libraires que nous utiliserons.