Bonsoir à tous.
Dans ce tutoriel, je me propose de vous expliquer le fonctionnement du système de signature numérique vu sous l'angle de la cryptanalyse.
NOTE : ce tutoriel contient des éléments de cryptologie asymétrique, si vous n'êtes pas à l'aise avec ce processus, je vous conseille de vous y familiariser.
I) Fichiers et programmes : le besoin d'une authentification
Avec le nombre toujours plus élevé de fichiers, programmes et autres objets virtuels transitant sur Internet, se pose le problème de la Sécurité.
Valider la conformité ou la provenance d'un fichier est devenu nécessaire afin de maintenir l'intégrité des systèmes qui les manipulent. En effet, les systèmes se sont dotés de mécanismes de contrôle dans le but de traquer tout fichier potentiellement dangereux, c'est à dire reconnu non conforme ou de source non identifiable.
Les technologies logicielles actuelles permettent l'élaboration de programmes malveillants toujours plus discrets, trompant de ce fait la vigilance des systèmes infectés qui n'en vérifient pas la source ou le contenu.
Devant la nécessité de l'élaboration d'un safe space (espace de sécurité) informatique, l'authentification logicielle s'est imposée d'elle même aux experts en sécurité. Et puisque la cryptologie permettait déjà la protection des données textuelles, c'est naturellement vers cette discipline que se sont tournés les chercheurs.
II) La signature numérique
Afin qu'un fichier soit déclaré comme conforme par le système chargé de son contrôle, il faut que ce dernier puisse identifier la source de l'envoi.
Utilisée bien avant pour les textes manuscrits, le concept de signature numérique a commencé à voir le jour dans une idée très simple : donner la possibilité au programmeur (ou à l'éditeur du fichier) de pouvoir signer sa création.
Cette signature numérique est un objet cryptologique permettant de valider l'authenticité du document aux yeux du système de contrôle.
Pour cela, l'éditeur du fichier doit obtenir un certificat d'authentification électronique (ou encore certificat de validation) qui génèrera une signature conforme applicable au fichier nouvellement créé. Ce certificat peut être obtenu de deux manières différentes : via une autorité de certification officielle, telles que VeriSign(c) ou CertSign(tm), ou via un générateur de certificat individuel tel que SelfCert.exe .
Passer par une autorité de certification est actuellement le moyen le plus fiable (pour le destinataire) d'identifier l'authenticité d'un programme. Le problème majeur de la génération personnelle de certificat est que ce-dernier ne sera reconnu par aucune autorité officielle, et sera donc à l'origine de nombreux faux-positifs de la part des systèmes de contrôle.
La signature numérique doit être la plus efficace possible, c'est pour cela qu'elle doit respecter les cinq éléments cryptologiques fondamentaux suivants :
La première étape consiste donc en l'obtention d'un certificat d'authenticité ; ce certificat génère deux clés de chiffrement : une clé privée, et une clé publique. Il génère également une fonction de hachage dans le but de produire un condensat du contenu du fichier.
A. Fonction de hachage et condensat
Une fonction de hachage est une fonction permettant de générer un condensat - ou une empreinte - d'une donnée (chaine de caractères, nombres, séquence...). Un condensat est donc une image cryptée de la donnée initiale, et doit permettre de retrouver cette donnée en clair via un déchiffrage ultérieur.
Exemple : informatique -> fonction de hachage -> 5FF82H6JL
Fonctions de hachages connues : MD5, SHA-1, Base64...
Chaque donnée différente traitée par une fonction de hachage doit donner un condensat différent (deux données identiques hachées donneront donc un condensat identique).
Soient des données x1 et x2 et des fonctions de hachage h1 et h2, on a :
Cependant, se pose un problème non-négligeable connu sous le nom de Paradoxe des Anniversaires. Celui-ci admet le risque de collision, c'est à dire que pour deux données différentes on obtienne le même condensat. Cela s'explique par le fait que l'empreinte d'une donnée est une séquence de bits ne possédant que deux valeurs possibles : 0 et 1.
Pour éviter ce risque de collision, ont été développées des fonctions de hachages injectives, c'est à dire admettant une infinité de termes composant un condensat.
Eléments mathématiques :
Une application est injective si pour tout élément y projeté dans l'ensemble d'arrivé Y il existe un élément x dans l'ensemble de définition X. On dit aussi que y est l'image projetée de x.
Pour une fonction de hachage injective, on a donc un domaine de définition à borne inférieure fixée et à borne supérieure ouverte, soit : D = ]0;+infini[ .
Ceci indique qu'une infinité de données peut être soumise en entrée de la fonction.
Cette fonction admet aussi comme solution l'ensemble des réels positifs, soit : S = {R*\(R-)} . Cela indique que l'ensemble d'arrivé admet une infinité de résultats.
Puisque l'ensemble d'images potentielles est infiniment plus large, nous obtenons une complexité supérieure à 2n solutions : S = [0;1]+[R*\(R-)] .
L'injectivité permet donc d'exclure tout risque de collision sur le condensat généré.
Néanmoins, dans le mécanisme de contrôle de conformité d'un fichier, authentifier la source ne suffit pas, il faut également pouvoir s'assurer de l'intégrité du fichier ; c'est à dire s'assurer que son contenu n'a pas été modifié. C'est dans cette optique qu'interviennent les clés privées et publiques.
III) Principe de contrôle
La société Vortex édite des logiciels, ses programmeurs viennent de finir leur nouveau produit : PC Manager Suit.
Avant de mettre ce logiciel en téléchargement, Vortex doit le rendre conforme en authentifiant sa validité ; pour cela elle fait appel à l'autorité de certification VeriSign(c) qui lui délivre un certificat de validité unique.
Le certificat génère une clé publique (Cpu) (inscrite automatiquement dans la base de données de VeriSign(c)), une clé privée (Cpr) et une fonction de hachage (Fh).
A retenir : la signature ne sert qu'à authentifier la source, non à assurer l'intégrité du contenu ; elle est composée par le condensat chiffré via la clé privée.
La plupart des antivirus embarquent un moteur de recherche par signature ; voilà pourquoi ils peuvent détecter les signatures frauduleuses. Leurs bases de données sont souvent mises à jour, ajoutant de nouvelles signatures malveillantes connues.
IV) Limites
L'authentification par signature n'est malheureusement pas infaillible, bien qu'elle reste actuellement le meilleur moyen de valider l'auteur d'un fichier.
De plus en plus de programmes malveillants disposent de la faculté de s'injecter dans des programmes reconnus comme conformes par le système : processus, drivers, utilitaires natifs... Ces programmes infectés disposent d'une signature valide, et le malware s'en sert donc afin d'être indétectable. Pour contrer ce phénomène, les antivirus utilisent les méthodes heuristiques.
Une autre tendance, plus difficile à mettre en oeuvre, consiste à extraire le certificat valide d'un programme (pilotes, services...) et à l'utiliser pour authentifier un programme malveillant ; cette méthode a été rendue célèbre par le malware Stuxnet qui avait détourné le certificat des pilotes Realtek.
V) Annexes
Bien que Base64 soit un protocole de chiffrement, il est considéré en cryptanalyse comme une fonction de hachage particulière (= transverse) pour deux raisons :
- présence d'un overlength, c'est à dire que la donnée cryptée et plus lourde que la donnée initiale.
- chaque paquet de 6 bits a mathématiquement une image (un antécédent) dans la table ASCII de stockage.
Ces deux paramètres définissent généralement un condensat, qui est le produit d'une fonction de hachage.
Pour ce qui est des fonctions à sens unique, leur définition est uniquement tributaire de leur complexité algorithmique.
En utilisation "classique", le Base64 possède une complexité égale à O(1), c'est à dire une complexité constante. Cependant, lorsqu'on lui passe en paramètre des données complexes (même si la table de stockage reste la même), sa complexité algorithmique évolue en O(n), soit en complexité linéaire ; ce qui la rapproche donc très fortement de la complexité d'une fonction à sens unique basique.
Dans ce tutoriel, je me propose de vous expliquer le fonctionnement du système de signature numérique vu sous l'angle de la cryptanalyse.
NOTE : ce tutoriel contient des éléments de cryptologie asymétrique, si vous n'êtes pas à l'aise avec ce processus, je vous conseille de vous y familiariser.
I) Fichiers et programmes : le besoin d'une authentification
Avec le nombre toujours plus élevé de fichiers, programmes et autres objets virtuels transitant sur Internet, se pose le problème de la Sécurité.
Valider la conformité ou la provenance d'un fichier est devenu nécessaire afin de maintenir l'intégrité des systèmes qui les manipulent. En effet, les systèmes se sont dotés de mécanismes de contrôle dans le but de traquer tout fichier potentiellement dangereux, c'est à dire reconnu non conforme ou de source non identifiable.
Les technologies logicielles actuelles permettent l'élaboration de programmes malveillants toujours plus discrets, trompant de ce fait la vigilance des systèmes infectés qui n'en vérifient pas la source ou le contenu.
Devant la nécessité de l'élaboration d'un safe space (espace de sécurité) informatique, l'authentification logicielle s'est imposée d'elle même aux experts en sécurité. Et puisque la cryptologie permettait déjà la protection des données textuelles, c'est naturellement vers cette discipline que se sont tournés les chercheurs.
II) La signature numérique
Afin qu'un fichier soit déclaré comme conforme par le système chargé de son contrôle, il faut que ce dernier puisse identifier la source de l'envoi.
Utilisée bien avant pour les textes manuscrits, le concept de signature numérique a commencé à voir le jour dans une idée très simple : donner la possibilité au programmeur (ou à l'éditeur du fichier) de pouvoir signer sa création.
Cette signature numérique est un objet cryptologique permettant de valider l'authenticité du document aux yeux du système de contrôle.
Pour cela, l'éditeur du fichier doit obtenir un certificat d'authentification électronique (ou encore certificat de validation) qui génèrera une signature conforme applicable au fichier nouvellement créé. Ce certificat peut être obtenu de deux manières différentes : via une autorité de certification officielle, telles que VeriSign(c) ou CertSign(tm), ou via un générateur de certificat individuel tel que SelfCert.exe .
Passer par une autorité de certification est actuellement le moyen le plus fiable (pour le destinataire) d'identifier l'authenticité d'un programme. Le problème majeur de la génération personnelle de certificat est que ce-dernier ne sera reconnu par aucune autorité officielle, et sera donc à l'origine de nombreux faux-positifs de la part des systèmes de contrôle.
La signature numérique doit être la plus efficace possible, c'est pour cela qu'elle doit respecter les cinq éléments cryptologiques fondamentaux suivants :
- Réutilisation impossible : la signature ne sert que pour un seul et unique document
- Non-modifiable : la signature, une fois générée et appliquée, ne peut pas être modifiée
- Authenticité : nécessiter de pouvoir retrouver la source à partir de la signature
- Irrévocabilité : une fois la signature appliquée elle ne peut plus être supprimée
- Infalsifiable : un tiers extérieur ne peut pas se faire passer pour la source
La première étape consiste donc en l'obtention d'un certificat d'authenticité ; ce certificat génère deux clés de chiffrement : une clé privée, et une clé publique. Il génère également une fonction de hachage dans le but de produire un condensat du contenu du fichier.
A. Fonction de hachage et condensat
Une fonction de hachage est une fonction permettant de générer un condensat - ou une empreinte - d'une donnée (chaine de caractères, nombres, séquence...). Un condensat est donc une image cryptée de la donnée initiale, et doit permettre de retrouver cette donnée en clair via un déchiffrage ultérieur.
Exemple : informatique -> fonction de hachage -> 5FF82H6JL
Fonctions de hachages connues : MD5, SHA-1, Base64...
Chaque donnée différente traitée par une fonction de hachage doit donner un condensat différent (deux données identiques hachées donneront donc un condensat identique).
Soient des données x1 et x2 et des fonctions de hachage h1 et h2, on a :
Code:
h1(x1)=h2(x2) <=> x1=x2
Cependant, se pose un problème non-négligeable connu sous le nom de Paradoxe des Anniversaires. Celui-ci admet le risque de collision, c'est à dire que pour deux données différentes on obtienne le même condensat. Cela s'explique par le fait que l'empreinte d'une donnée est une séquence de bits ne possédant que deux valeurs possibles : 0 et 1.
Pour éviter ce risque de collision, ont été développées des fonctions de hachages injectives, c'est à dire admettant une infinité de termes composant un condensat.
Eléments mathématiques :
Une application est injective si pour tout élément y projeté dans l'ensemble d'arrivé Y il existe un élément x dans l'ensemble de définition X. On dit aussi que y est l'image projetée de x.
Pour une fonction de hachage injective, on a donc un domaine de définition à borne inférieure fixée et à borne supérieure ouverte, soit : D = ]0;+infini[ .
Ceci indique qu'une infinité de données peut être soumise en entrée de la fonction.
Cette fonction admet aussi comme solution l'ensemble des réels positifs, soit : S = {R*\(R-)} . Cela indique que l'ensemble d'arrivé admet une infinité de résultats.
Puisque l'ensemble d'images potentielles est infiniment plus large, nous obtenons une complexité supérieure à 2n solutions : S = [0;1]+[R*\(R-)] .
L'injectivité permet donc d'exclure tout risque de collision sur le condensat généré.
Néanmoins, dans le mécanisme de contrôle de conformité d'un fichier, authentifier la source ne suffit pas, il faut également pouvoir s'assurer de l'intégrité du fichier ; c'est à dire s'assurer que son contenu n'a pas été modifié. C'est dans cette optique qu'interviennent les clés privées et publiques.
III) Principe de contrôle
La société Vortex édite des logiciels, ses programmeurs viennent de finir leur nouveau produit : PC Manager Suit.
Avant de mettre ce logiciel en téléchargement, Vortex doit le rendre conforme en authentifiant sa validité ; pour cela elle fait appel à l'autorité de certification VeriSign(c) qui lui délivre un certificat de validité unique.
Le certificat génère une clé publique (Cpu) (inscrite automatiquement dans la base de données de VeriSign(c)), une clé privée (Cpr) et une fonction de hachage (Fh).
- Hachage du contenu de PC Manager Suit via la fonction de hachage et obtention d'un condensat (Co)
- Le condensat obtenu est chiffré via la clé privée ce qui donne la signature numérique ( S = Cpr(Co) )
- Le contenu est également chiffré via la clé publique
- Le programme contenant signature et contenu chiffré est mis en téléchargement
- Jack télécharge le fichier et l'exécute
- L'antivirus de Jack identifie le certificat, récupère la clé publique et déchiffre la signature et le contenu
- L'antivirus de Jack utilise la même fonction de hachage (obtenu via le certificat) afin de produire lui-même un condensat du contenu déchiffré
- L'antivirus agit selon la situation :
- la signature est la même (et n'est pas dans la base de données de l'antivirus) et le condensat aussi, le fichier est donc conforme
- la signature est la même mais pas le condensat, le fichier a donc été modifié ( = dangereux)
- le condensat est le même mais pas la signature, l'identité de la source a donc été changée ( = dangereux)
- la signature et le condensat ne sont pas les mêmes, le fichier a donc été entièrement modifié ( = dangereux++)
- la signature est contenue dans la base de données de l'antivirus ( = virus connu)
A retenir : la signature ne sert qu'à authentifier la source, non à assurer l'intégrité du contenu ; elle est composée par le condensat chiffré via la clé privée.
La plupart des antivirus embarquent un moteur de recherche par signature ; voilà pourquoi ils peuvent détecter les signatures frauduleuses. Leurs bases de données sont souvent mises à jour, ajoutant de nouvelles signatures malveillantes connues.
IV) Limites
L'authentification par signature n'est malheureusement pas infaillible, bien qu'elle reste actuellement le meilleur moyen de valider l'auteur d'un fichier.
De plus en plus de programmes malveillants disposent de la faculté de s'injecter dans des programmes reconnus comme conformes par le système : processus, drivers, utilitaires natifs... Ces programmes infectés disposent d'une signature valide, et le malware s'en sert donc afin d'être indétectable. Pour contrer ce phénomène, les antivirus utilisent les méthodes heuristiques.
Une autre tendance, plus difficile à mettre en oeuvre, consiste à extraire le certificat valide d'un programme (pilotes, services...) et à l'utiliser pour authentifier un programme malveillant ; cette méthode a été rendue célèbre par le malware Stuxnet qui avait détourné le certificat des pilotes Realtek.
V) Annexes
Bien que Base64 soit un protocole de chiffrement, il est considéré en cryptanalyse comme une fonction de hachage particulière (= transverse) pour deux raisons :
- présence d'un overlength, c'est à dire que la donnée cryptée et plus lourde que la donnée initiale.
- chaque paquet de 6 bits a mathématiquement une image (un antécédent) dans la table ASCII de stockage.
Ces deux paramètres définissent généralement un condensat, qui est le produit d'une fonction de hachage.
Pour ce qui est des fonctions à sens unique, leur définition est uniquement tributaire de leur complexité algorithmique.
En utilisation "classique", le Base64 possède une complexité égale à O(1), c'est à dire une complexité constante. Cependant, lorsqu'on lui passe en paramètre des données complexes (même si la table de stockage reste la même), sa complexité algorithmique évolue en O(n), soit en complexité linéaire ; ce qui la rapproche donc très fortement de la complexité d'une fonction à sens unique basique.