Principes et lois cryptographiques
Bienvenue sur ce site consacré à la cryptographie
Ce site a été réalisé dans le cadre d'études d'ingénieurs. Il contient une présentation technique de la cryptographie (algorithmes, principes, etc...) ainsi qu'une juridique expliquant le statut particulier de cette science. Enfin, des exemples de logiciel et de codes en java sont donnés.
Fait par AIME Séverine, le 10 janvier 2005.
La cryptographie
Introduction
Ce site a pour but d'expliquer les principes techniques de la cryptographie mais aussi les lois la régissant.
D'une part, il existe plusieurs manières de crypter des données avec différents calculs complexes.
D'une autre part, cette puissante technologie qu'est la cryptographie est régie par des lois précises et possède un statut juridique bien spécifique et contre-versé.
Mais je ne vous en dis pas plus et vous invite à consulter les rubriques correspondantes.
Bref historique
Il est important de se souvenir des débuts de la cryptographie pour comprendre son enjeux et surtout son statut juridique.
A votre avis, à quelle pèriode de l'histoire apparaît la première forme de cryptographie ?
Il nous faut remonter jusqu'au temps de Jules César et des Romains. En effet, Jules César codait ses messages en décalant les lettres de X places dans un sens et le destinataire décodait le message en décalant les lettres de X places dans l'autre sens. Ainsi la seule connaissance du chiffre x et du sens de décodage suffisait à décrypter le message. Cette technique avait pour nom "Rot 13".
Mécanismes de cryptage
Il existe deux grandes techniques de cryptage:
- le cryptage symétrique
- le cryptage asymétrique
1. Clé symétrique (Symetric-key encryption)
La caractéristique la plus importante de cette méthode est qu'une seule clé sert à coder et à décoder le message. Chaque ordinateur doit connaître cette clé c'est à dire son code pour crypter et décrypter le message.
Par exemple, vous décidez que pour crypter votre message, vous substituez chaque lettre par la lettre qui se situe 3 places plus loin dans l'alphabet. De ce fait, "A" devient "C," et "B" devient "D". Le destinataire du message doit connaître cette règle pour décoder le message. Jules César utilisait ce principe pour communiquer des messages secrets (cf Introduction).
Il est vrai que cet exemple est trop simple pour être utilisé dans la vrai vie, mais il montre la faiblesse de ce type de cryptage : une seule clé est utilisée pour crypter et décrypter. Il suffit donc de récupérer la clé pour comprendre l'échange des données et envoyer des données dans la conversation (cf Enigma rubrique Armement).
Cependant, l'avantage de cette méthode est qu'elle ne requiert pas de machine extrêmement performante pour les calculs d'encodage et de décodage.
Schéma explicatif
Ce schéma représente le processus d'échange d'un message crypté de façon symétrique entre une machine A et une machine B. A génère une clé symétrique S à l'aide d'un algorithme comme TripleDES et crypte son message avec celle-ci. Ensuite, il transmet par n'importe quel moyen (téléphone, mail, fax, ....) la clé S à B et lui envoie son message crypté. Ainsi B connait la clé et le message. Il peut alors décoder le message de A à l'aide de la clé S.
Dans le système symétrique, une seule et même clé est nécessaire au codage et décodage d'un message.
2. Clé asymétrique (Public-key encryption)
Contrairement au système symétrique, la méthode asymétrique combine deux clés:
- une clé public
- une clé privée
Ces clés sont générées en même temps.
La clé privée, générée par un algorithme comme RSA, n'est connue que par son propriétaire. Elle lui est privée. A aucun moment, elle ne doit être transmise.
La clé publique va, quand à elle, être transmise publiquement. Par exemple, elle sera publiée dans des annuaires ou transmise par son propriétaire lui même.
Mais quels sont leur rôle ?
La clé publique sert à coder le message et la clé privée sert à décoder le message. Attention, la clé public utilisée doit être celle du destinataire du message. En effet, si le destinatire décrypte avec sa clé privée le message, il faut que ce dernier ait été crypté par sa clé publique correspondante.
Schéma explicatif
Ce schéma représente le processus d'échange d'un message crypté de façon asymétrique. Ici, A veut envoyer un message crypté à B. B a précédemment généré un couple de clés et transmet sa clé publique Sq à A. A crypte alors son message avec la clé Sq et envoie ensuite le message codé à B. B décrypte le message à l'aide de sa clé privée.
Dans le cas où, une personne malveillante intercepterait la clé publique et le message, il ne pourrait pas le décoder car il lui manque la clé privée correspondante. Par contre, il pourrait crypter un message avec cette clé publique et l'envoyer à B. Il interfère alors dans la communication et peut juste faire passer de faux messages à B.
Il apparait donc important de vérifier l'identité de celui qui transmet le message mais aussi de celui qui donne sa clé publique à l'aide notamment de certificat d'authenticité (Cf Authentification et Corruption).
L'avantage de cette méthode asymétrique est qu'elle émane d'une combinaisons de deux clés mais par contre elle est extrêmement gourmande en ressources lors des calculs de codage et d'encodage.
Dans le système asymétrique, deux clés sont nécessaires au processus d'échange. Une publique connue de tous et servant à coder le message. Une privée connue seulement d'une seule machine et servant au décodage du message.
3. Combinaisons des deux
Afin de palier aux inconvénients des systèmes symétriques et asymétriques, un autre mécanisme consiste à combiner ces deux méthodes.
Son principe est le suivant:
- Une clé symétrique pour coder et décoder le message
- Une clé asymétrique pour crypter la clé symétrique
Une clé symétrique est générée par l'expéditeur du message avec laquelle il va le crypter de manière symétrique. Il transmet ce message codé au destinataire. Jusque là, rien de nouveau. Il lui faut donc ensuite transmettre la clé symétrique au destinataire pour qu'il puisse décoder le message. C'est à cette étape, que le processus diffère. L'expéditeur va crypté la clé symétrique avec la clé publique du destinataire. Ce dernier décode la clé symétrique avec sa clé privée qu'il est le seul à connaitre et peut ensuite décoder le message.
Schéma explicatif
Ce schéma décrit le processus d'échange d'un message codé à l'aide d'une combinaison de système symétrique et asymétrique.
B transmet sa clé publique à A. A génère une clé symétrique qu'il code avec la clé publique de B et la transmet à B. A crypte ensuite le message avec la clé symétrique. B obtient la clé symétrique avec sa clé privée et décrypte ensuite le message.
A et B se sont donc échangés une clé symétrique de manière asymétrique. Ils peuvent maintenant communiquer en symétrique sans que personne puisse lire le message car la clé symétrique n'est pas retransmise. Même si une personne interceptait la clé symétrique, elle ne pourrait pas la lire ni la décoder car elle ne possède pas la clé privée du destinataire. Ainsi, par ce processus personne ne peut s'introduire dans la conversation. Le problème de ressources est aussi plus ou moins réglé puisque le décodage le plus gourmand (asymétrique) n'est réalisé qu'une seule fois pour retrouver la clé symétrique. Ensuite, ce sont seulement des calculs symétriques qui sont réalisés.
Cette clé symétrique n'est utilisée que pour un seule session entre les deux machines. Dans le cas d'ouverture d'une autre session, le processus recommence.
Cette technique est très présente sur Internet par l'intermédiaire du protocole SSL (HTTPS).
Dans le système combiné, une clé symétrique est utilisée pour coder et décoder le message mais cette clé symétrique est cryptée de façon asymétrique avant d'être transmise.
Algorithmes utilisés
A chaque mécanisme de cryptage correspond plusieurs algorithmes. La clé générée par ces algorithmes qu'elle soit symétrique ou asymétrique peut varier en longueur c'est à dire en nombre de bits qui la représente.
Par exemple, avec un codage sur 128 bits, il y a
3,402,823,669,209,384,634,633,746,074,300,000,000,000,000,000,000,000,000,000,000,000,000
combinaisons différentes. Au tant dire que c'est chercher une épingle dans une motte de foin.
1. Systèmes à clé privée
DES
L'algorihtme DES, reconnu en 1978, utilise la structure Feister. Un réseau de Feistel opère sur la moitié des données à chaque ronde et échange les moitiés après chaque ronde. C'est un système de chiffrement par bloc de 64 bits mais seulement 56 bits sont utiles pour l'algorithme. Les 8 autres restants servent aux tests de parité. Ces 8 bits permettent, en effet, de vérifier l'intégrité de la clé. Ils sont répartis: 1 tous les 8 bits. Chaque octet de la clé est testé pour avoir une parité impaire c'est à dire que chacun de ces bits de parité complète pour qu'il y est un nombre impaire de 1 dans l'octet. Par exemple, si l'octet comporte- 6 bits à 1 alors le bit de parité=1
- 5 bits à 1 alors le bit de parité=0
Cet algorithme repose sur des opérations de combinaisons, substitutions et permutations entre le texte à chiffrer et la clé. Ces opérations ont la particularité de pouvoir être faites dans les deux sens (pour le déchiffrement).
Ces opérations se déroulent ainsi
- Fractionnement du texte en blocs de 64 bits (8 octets)
- Permutation initiale des blocs
- Découpage des blocs en deux parties: gauche et droite, nommées G et D
- Etapes de permutation et de substitution répétées 16 fois (appelées rondes)
- Recollement des parties gauche et droite puis permutation initiale inverse
Triple DES
Le triple DES est simplement l'application de l'algoritme DES 3 fois.Cet algorithme utilise 3 clés K1, K2, K3. Mais il existe plusieurs manières de les utiliser:
- Soit la première clé sert au premier chiffrement, la deuxième au déchiffrement et la dernière à un autre chiffrement.
- soit cet algorithme applique trois chiffrements DES avec chacune des clés.
- Les trois clés sont différentes.
- Deux clés sont équivalentes. Dans le cas de chiffrement-déchiffrement-chiffrement se sont les clés de chiffrement qui seront égales. C'est le cas le plus courant.
AES
L'algorithme AES n'est pas basé sur la même structure que celui de DES. En effet, il s'appuie sur Rijndael qui est un algorithme de chiffrement par bloc, avec plusieurs tours. Sa longueur de bloc et sa longueur de clé sont variables allant de 128, 192 à 256 bits (contre 56 pour le DES).La clé et les blocs sont représentés sous forme d'une matrice de 4 lignes et d'un nombre de colonne variable selon la longueur de la clé divisée par 32, soit 4, 6 ou 8 colonnes. Cette matrice est appelé « état » au cours des différentes itérations.
Au premier tour, on remplit l'état avec les données du bloc, et on fait de même pour la clé. Le nombre de tours dépend de la longueur du bloc et de la clé. A chaque tour, quatres transformations différentes sont effectuées, sauf pour le dernier où seulement trois sont effectuées.
Ce nouveau mode a l'avantage d'être peu gourmand en mémoire, simple et rapide à executer.
2. Systèmes à clé public
Diffie-Hellman
Cet algorithme inventé en 1976 est le plus ancien cryptosystème à clé publique mais reste néanmoins le plus utilisé.Ses atouts sont:
- Générer une clé sans échange d'informations au préalable.
- Ne réaliser aucune authentification.
- Reposer sur des logarithmes discrets (difficile à calculer) pour accroitre la sécurité.
Principe:
A et B ont donc établis une clef symétrique secrète commune qui sera ensuite utilisée par un algorithme symétrique comme DES.
Dans notre cas, la clé publique de
- A est X
- B est Y
- A est x
- B est y
RSA
Cet algorithme fut inventé en 1977 et porte les initiales de ses inventeurs.Sa sécurité réside en la difficulté de factoriser des grands nombres. En effet, nous savons qu'un nombre entier est égale au produit de nombres premiers.Il est alors facile de retrouver ce produit en revanche trouver les facteurs premiers d'un grand nombre est une opération très difficile (aucune rapide n'est connue à ce jour).
Principe
- Constitution de la clé publique:
Deux grands nombres premiers (entre 150 et 200 chiffres) p et q sont choisis. Nous calculons n=p*q.
Ensuite, nous choisissons e tel que e et (p-1)(q-1) soient premiers entre eux.
e et n constitue la clé publique. - Constitution de la clé privée:
d = e^(-1) (mod (p-1)(q-1)).
d consitue la clé privée. - Chiffrement:
Soit m, un message de longueur variable, il faut découper m en bloc de taille inférieure à n (pour que chaque bloc n'est qu'une seule représentation possible modulo n). Pour chaque bloc mi on calcule :
Ci = mi^e mod n - Déchiffrement:
Mi = ci^d mod n
3. Fonctions de hachage
Qu'est ce q'une fonction de hachage ?
Une fonction de hachage permet d'obtenir un condensé d'un message de manière unique et dans un seul sens. En effet, on ne doit pas pouvoir retrouver le message à partir de sa version condensée.MD5
Le MD5 (Message Digest version 5) est une fonction de hachage qui fournit une empreinte de 128 bits.Son principe est de manipuler des blocs de 512 bits. Pour cela , il complète la longueur du message par un 1 suivi d'autant de 0 que nécessaires pour arriver une longueur congrue à 448 modulo 512. cette opération s'appelle "padding" et à toujours lieu.
Ensuite,la longueur initiale du message est ajoutée aux 448 bits. La taille finale est donc un multiple de 512 bits. On découpe ensuite chaque bloc de 512 bits en 16 blocs de 32 bits qui seront passés aux 4 fonctions.
On définit 4 buffers de 32 bits A,B,C et D, initialisés ainsi en hexadécimal
- A=01234567
- B=89abcdef
- C=fedcba98
- D=76543210
- F(X,Y,Z) = (X AND Y) OR (not(X) AND Z)
- G(X,Y,Z) = (X AND Z) OR (Y AND not(Z))
- H(X,Y,Z) = X xor Y xor Z
- I(X,Y,Z) = Y xor (X OR not(Z))
Pour chaque bloc de 512 bits du texte, on fait les opérations suivantes
- on sauvegarde les valeurs des registres dans AA,BB,CC,DD.
- on calcule de nouvelles valeurs pour A,B,C,D à partir de leurs anciennes valeurs, à partir des bits du bloc qu'on étudie, et à partir des 4 fonctions F,G,H,I.
- on fait A=AA+A, B=BB+B, C=CC+C, D=DD+D.
Le résultat sur 128 bits est obtenu en mettant bout à bout les 4 buffers A,B,C,D de 32 bits pour chaque bloc de 512 bits constitant le message.
Si vous désirez, plus amples informations sur les:calculs intermédiaires
4. Protocoles Web
S-HTTP
S-HTTP qui signifie Secure-HTTP permet de sécuriser les transactions du protocole HTTP en cryptant les messages.S-HTTP travaille au-dessus du protocole HTTP en marquant chaque document d'un certificat.
Trois principes composent les messages S-HTTP
- les requêtes HTTP
- les préférences cryptographiques de l'expéditeur
- les préférence cryptogaphiques du destinataire
SSL
SSL permet de sécuriser les transactions effectuées sur le Web. Contrairement à S-HTTP, SSL agit au niveau de la couche transport. Il est donc indépendant du protocole Web utilisé et peut par conséquent sécuriser des transactions faites par FTP, POP ou IMAP. C'est ce protocole qui est caché sous HTTPSSon fonctionnement est décrit dans la rubrique "Mécanismes de cryptage" paragraphe Combinaisons des deux.
SSL vs S-HTTP
SSL et S-HTTP ne sont pas des protocoles concurrents mais complémentaires car ils n'agissent pas sur la même couche. En effet, SSL permet de sécuriser la connexion Internet tandis que S-HTTP permet de fournir des échanges HTTP sécurisés.Authentification et corruption
Le but de l'authentification et de la détection de la corruption est de créer un environnement sécurisé.
1. Moyens d'authentification
L'authentification est une opération pour s'assurer de l'identité de l'interlocuteur.
Les différents moyens d'authentification sont
- UserName et password
- Passcard
- Digital Signature
- Certificat d'authenticité
- Systèmes biométriques
Certificat d'authenticité
Les certificats sont le plus souvent utilisés dans les systèmes asymétriques pour garantir la clé publique.Pourquoi un certificat ?
Les clés publiques sont généralement partagées à l'aide d'annuaire électronique (généralement au format LDAP) ou d'un site Web. Malheureusement, un pirate peut tout à fait substituer la clé publique d'une personne à la sienne et ainsi lire tous les messages cryptés à l'aide de sa clé privée correspondante. Le problème est donc de garantir que la clé est bien celle de l'utilisateur à qui elle est associée. Pour résoudre ce problème, nous utilisons des certificats d'authenticité délivrés par des organismes indépendants appelés autorité de certification. Pour que le certificat soit régulièrement contrôlé, il est délivré avec une date de validité comme pour les cartes bancaires. Ainsi, l'organisme délivreur recontrôle tous les ans les certificats de ses clients pour garantir une meilleure authenticité.
Qu'est ce qu'un certificat ?
Un certificat est un fichier divisé en deux parties contenant
- les informations
- la signature de l'autorité de certification
- le nom de l'autorité de certification
- le nom du propriétaire du certificat
- la date de validité du certificat
- l'algorithme de chiffrement utilisé
- la clé publique du propriétaire
L'ensemble de ces informations est signé par l'autorité en créant une empreinte avec une fonction de hachage qui est ensuite cryptée avec la clé privée de l'autorité de certification. Sa clé publique est quand à elle très largement diffusée pour permettre à n'importe quel utilisateur de vérifier la signature du certificat.
2. Moyens de détection de corruption
La corruption est l'altération d'un message par un individu tiers qui entraîne la non conformité du message par rapport à son état initial.
Les moyens de détection de corruption sont
- CRC
- Checksum
Armement, technologies à double usage
Les lois régulant notamment les technologies de sécurité de l'information existe pour garantir la paix dans le monde et éviter l'armement massif de certains pays.
Pourquoi parler d'armement dans un site sur la cryptographie ?
Il existe des lois internationales, communautaires et nationales sur l'exportation des armes et des biens et technologies à double usage.
Définition d'un bien ou une technologie à double usage ?
On entend par " biens à double usage" les produits, les logiciels et les technologies (y compris l'assistance technique) susceptibles d'avoir une utilisation tant civile que militaire. Ils incluent tous les biens qui peuvent à la fois être utilisés à des fins non explosives et entrer de manière quelconque dans la fabrication d'armes nucléaires ou d'autres dispositifs nucléaires explosifs ". Attention : sont également concernés les logiciels ou technologies (y compris l'assistance technique) transmis par voie électronique, téléphone ou télécopieur.
L'exportation de ces biens est soumise à licence. Ces biens sont divisés en 9 catégories et la cryptographie fait partie de la catégorie 5 : télécommunication et sécurité de l'information.
Pourquoi considérer la cryptographie comme une arme ?
Cette "peur" de la démocratisation de la cryptographie des gouvernements peut se comprendre lorsque l'on se souvient du cas lors de la 2ème guerre mondiale de la machine Enigma.
Le 8 mai 1941, le destroyer américain Broadway récupérait à bord d'un sous-marin allemand, l'U-110, la machine de cryptage "Schlüssel M" servant aux liaisons radios des cuirracés et sous-marins allemand avec leur quartier général. La découverte de la clé de cryptage baptisée "Triton Enigma" par les anglais constitua l'une des performances les plus importantes dans la bataille de l'atlantique. Ce succès permit de sauver de nombreuses vies humaines et d'importantes quantités de matériels décisifs lors du débarquement en Normandie 3 ans plus tard.
Nous voyons bien par ce fait historique que la cryptographie peut se révéler être un atout précieux de la guerre.
Il est important de rappeler que la classification de la cryptographie dans l'armement et les biens à double usage est très contre-versée.
La cryptographie est considérée comme une arme
Accord et lois relatifs à l'exportation
1. Niveau internationale
L'accord de Wassenaar établit en 1995 et signé par 33 pays dont la France relate du contrôle des exportations d'armement et de biens et technologies à double usage. Sa première fonction est de contrôler l'exportation de ces produits vers les pays terroristes. L'importation est facile mais l'exportation très réglementée.
2. Niveau Européen et droits français
La politique de l'Europe reprend les arrangements de Wassenaar et les directives de plusieurs organismes d'armement comme les armes nucléaires et les armes chimiques.
Chaque exportation vers un pays tiers à l'Union Européenne subit un contrôle et doit obtenir une licence d'exportation. Il en est de même pour la transmission de logiciels ou de technologies par voie électronique, par télécopieur ou téléphone. En plus des réglementations européennes, chaque état membre peut conservé ses propres contrôles nationaux.
En Mars 1999, La France qui historiquement était le pays le plus draconien en matière de restrictions cryptographiques a allégé sa politique. En effet, l'offre et l'utilisation de système cryptographique de moins de 128 bits requièrent maintenant une simple déclaration.
Les logiciels soumis au contrôle européen et qui doivent obtenir une licence d'exportation sont:
- Crypto-analyse
- Clé symétrique > 56 bits
- Clé asymétrique > 512 bits
cryptage en java
Dans cette page sont regroupés trois exemples de classe permettant de crypter un message.
1. Codage Rot13
Ce premier exemple permet de coder et de décoder un message selon le principe qu'utilisait Jules César. Il affiche le message initial, le message codé et le message décodé.
import java.security.NoSuchAlgorithmException;
/**
* @author saime
*
* Classe qui code et decode un message en Rot13
*/
public class Rot13 {
public static String encode(String line){
String res="";
for(int i=0;i<line.length();i++){
if(Character.isUpperCase(line.charAt(i))){
char tmp=(char)((((line.charAt(i)-'A')+13)%26)+'A');
res+=Character.toString(tmp);
}else if(Character.isLowerCase(line.charAt(i))){
char tmp=(char)((((line.charAt(i)-'a')+13)%26)+'a');
res+=Character.toString(tmp);
}else{
res+=line.charAt(i);
}
}
return res;
}
public static void main(String[] args) throws NoSuchAlgorithmException{
String messCode=encode(args[0]);
System.out.println("message initial:"+args[0]+" message code:"+messCode);
String messDecode=encode(messCode);
System.out.println("message code:"+messCode+" message decode:"+messDecode);
}
}
2. Codage en MD5
Cette deuxième classe java a pour but de coder une chaine de caractère passée en paramètre avec une fonction de hachage en MD5. Elle affiche la chaine initiale et la chaine codée.
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author saime
*
* Classe qui code une chaine de caractères passée en argument en MD5.
* Puis affiche la chaine initial et la chaine codée
*/
public class Md5 {
public static String encodePassword(String clearTextPassword) throws
NoSuchAlgorithmException{
MessageDigest md=MessageDigest.getInstance("MD5");
md.update(clearTextPassword.getBytes());
byte messageDigest[]=md.digest();
StringBuffer hexString=new StringBuffer();
for (int i=0;i<messageDigest.length;i++) {
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}
return hexString.toString();
}
public static void main(String[] args) throws NoSuchAlgorithmException{
String messCode=encodePassword(args[0]);
System.out.println("message initial:"+args[0]+" message code:"+messCode);
}
}
3. Codage symétrique avec une clé désirée
Ce troisième exemple permet de coder et décoder un message passée en argument à l'aide d'une clé symétrique spécifiée par le deuxième argument. Il affiche le message initial, le message codé puis le décodé.
import java.security.NoSuchAlgorithmException;
/**
* @author saime
*
* Classe qui code et décode un message passé en argument
* à l'aide d'une clé symétrique passée en deuxième argument.
*/
public class CodeCle {
public static String encode(String msg, String cle){
byte [] msgByte=msg.getBytes();
byte [] cleByte=cle.getBytes();
int cleInd=0;
byte [] resByte=new byte[msgByte.length];
for(int i=0;i<msgByte.length;i++){
resByte[i]=(byte)(msgByte[i] ^ cleByte[cleInd]);
cleInd=(cleInd+1) % cleByte.length;
}
return new String(resByte);
}
public static void main(String[] args) throws NoSuchAlgorithmException{
String messCode=encode(args[0],args[1]);
System.out.println("Cle :"+args[1]);
System.out.println("message initial:"+args[0]+" message code:"+messCode);
String messDecode=encode(messCode,args[1]);
System.out.println("message code:"+messCode);
System.out.println("message decode:"+messDecode);
}
}
Logiciel PGP
Le logiciel PGP est un logiciel gratuit et portable permettant de générer un couple de clés publique et privée à usage personnel.
Il fournit aussi une signature électronique et un certificat de clés.
Par exemple, un utilisateur peut ainsi envoyer des mails ou des données cryptés de façon asymétrique.
Son utilisation est légale en Europe et depuis peu aux USA.
Il est téléchargeable sur http://www.pgp.com