HashMask
CHIFFREMENT
PAR HACHAGE
SECURISE
Auteurs:
Philippe Lheureux et Dimitri Mestdagh
1 - Objectif
Produire un masque jetable spécifique à une clé comprise entre 8 et 256 caractères (2048 bits). Le masque crée devra faire au minimum la même longueur que le texte clair, être le plus aléatoire possible et n'être utilisé qu'une seule fois par fichier ou texte chiffré.
2 - Réalisation
Création d'un sélecteur de fichier pour charger le fichier à chiffrer ou à déchiffrer.
Lecture du nombre de caractères à chiffrer à stocker dans une variable.
On va prendre l'exemple d'un fichier contenant 5000 caractères à chiffrer.
Création d'une zone de texte (jusqu'à 256 caractères) pour la saisie de la clé avec création possible de pass-phrase complexe 64, 128, 256, 512, 1024, 2048 bits.
Exemple de phrase clé simple : " Le lutin bleu "
Préparation du masque
A : Créer un tableau de substitution final dépendant de la clé
Au départ, le tableau de substitution est un tableau classique à une ou deux dimensions et contenant les 256 caractères pouvant servir de masque.
Afin de compliquer une éventuelle cryptanalyse, ce tableau doit être brouillé en fonction de la clé utilisée. Pour ce faire, nous allons utiliser la fonction de hachage SHA-256 qui retourne une suite de 64 caractères hexadécimaux.
On commence calculer le SHA-256 de la première lettre de la clé.
SHA-256(L)= 72dfcfb0c470ac255cde83fb8fe38de8a128188e03ea5ba5b2a93adbea1062fa
Et ensuite on swap les valeurs du tableau en fonction des 32 paires obtenues avec le SHA-256.
La valeur contenue dans la case 72 sera échangée avec celle de la case df
Puis celle de cf sera échangée avec b0, celle de c4 avec 70 etc.
32 cases sur 256 seront donc brouillées à ce premier passage.
Il faut donc continuer avec le même principe en lisant progressivement la totalité de la clé.
SHA-256(Le)= a2fbc754b9ee1dc5a793eeb2c804c5e6cf962f680909050f28a69b6cdfdbab89
SHA-256(Le )=
c2b502878947c94ec176623eb4f3e25456539a5aa634d05b69e6a141852942b9
SHA-256(Le l)=
fe4f938197b8f89775ce5eafaf942463faa0155019cb19d86282900326a8b9f2
SHA-256(Le lu)=
SHA-256(Le lut)=
SHA-256(Le luti)=
SHA-256(Le lutin)=
SHA-256(Le lutin )=
SHA-256(Le lutin b)=
SHA-256(Le lutin bl)=
SHA-256(Le lutin ble)=
Et ainsi de suite jusqu'à la lecture complète de la clé.
SHA-256(Le lutin bleu)=
d23f77d0cccea53562137203914257dd25a492dce0db4206d9be5de06cf7ec44
Dans notre exemple, la clé comporte 13 caractères (en comptant les espaces). A la fin de la lecture, le tableau de substitution de 256 caractères aura donc subit 13 x32 swap = 416 swap.
Il sera donc brouillé en fonction d'une clé bien précise. Avec la fonction de hachage SHA-256, une autre clé ou le moindre changement de caractère produirait un brouillage complètement différent.
B : Création du masque aléatoire intermédiaire
La formule retenue pour la création du masque intermédiaire est la suivante.
SHA-256 (Chaine1concaténée avec la clé)=masque intermédiaire
Chaine1=SHA-256(Le lutin bleu) =
d23f77d0cccea53562137203914257dd25a492dce0db4206d9be5de06cf7ec44
Clé=Le lutin bleu
Masque intermédiaire = SHA-256(d23f77d0cccea53562137203914257dd25a492dce0db4206d9be5de06cf7ec44Le lutin bleu)=
947961d1b85703c0b918a06a70507f3d4e3a948f0b3cd61cb652a661a48a143b
Ce numéro devient la nouvelle Chaine1 pour le calcul de la suite du masque qui est :
SHA-256(947961d1b85703c0b918a06a70507f3d4e3a948f0b3cd61cb652a661a48a143bLe lutin bleu)= eef73a3c5405cf2747e9d1084aea7e97022a1e19a9f34a97c17f98d61bc171e2
et ainsi de suite, autant de fois que nécessaire pour obtenir un masque intermédiaire qui fait au minimum le double du clair à chiffrer.
Afin d'éviter de stocker en mémoire un masque aléatoire faisant le double du clair, la substitution qui suit se fera par blocs de 64 caractères ( SHA-256)
C : Création du masque de substitution définitif
Le tableau de substitution définitif contenant 256 caractères est indispensable. Il a été mélangé au chapitre A et il va servir à substituer les paires de chiffres du masque intermédiaire avec un seul caractère.
00=/
01=G
02=a
03=1
04=N
05=p
06=^
07=+
08=;
09 =T
0A=q
0B=A
0C=#
0D=z
0E=U
0F=6
10=0
11=r
12=esp
13= ?
14=X
15=s
Etc. jusqu'à
FD=!
FE=%
FF=7
Si le masque intermédiaire est par exemple :
d23f77d0cccea53562137203914257dd25a492dce0db4206d9be5de06cf7ec4400eda0c306d6b430b3ca0e00578bc2cc7d49cbcfb3223ce47a847a01b828b6fe etc
Les paires sont lues par décalage d'une paire de chiffres à chaque fois : d2,3f,77,d0,cc,ce,a5 etc .
Paire |
Tableau de substitution |
d2 |
8 |
3f |
? |
77 |
M |
d0 |
J |
cc |
/ |
ce |
H |
a5 |
% |
64 chiffres du masque intermédiaire pseudo aléatoire donneront donc 32 caractères du masque. Les SHA-256 étant générés jusqu'à ce que la longueur de masque définitif = celle du clair.
Au final on obtient un masque qui est totalement dépendant de la clé. Le résultat n'est pas réversible et le moindre changement de caractère dans la clé produira des changements profonds dans le masque.
C : Chiffrement / déchiffrement
Pour le chiffrement, il suffit de faire
Clair xor Masque = Chiffré
Et pour le déchiffrement
Chiffré xor Masque = Clair
D : Sécurité
Extrait de Wikipédia (en italique)
Le chiffrement par la méthode du masque jetable consiste à combiner le message en clair avec une clé présentant les caractéristiques très particulières suivantes :
Le masque doit être une suite de caractères au moins aussi longue que le message à chiffrer.
Les caractères composant le masque doivent être choisis de façon totalement aléatoire.
Chaque " masque ", ne doit être utilisée qu'une seule fois (d'où le nom de masque jetable).
L'intérêt considérable de cette méthode de chiffrement, c'est que si les trois règles ci-dessus sont respectées strictement, le système offre une sécurité théorique absolue, comme l'a prouvé Claude Shannon en 1949.
Avec Hashmask,
La clé produit bien un masque aussi long que le message à chiffrer.
Les caractères composant le masque sont dépendants d'une formule SHA-256 salée qui génère de l'aléatoire.
Chaque masque n'est utilisé qu'une seule fois
Seul celui qui connaît la clé peut reconstruire le masque et il est impossible de remonter du masque vers la clé. La seule attaque possible est donc une attaque par force brute sur la clé.
En simplifiant l'échange des masques sans sacrifier vraiment à la sécurité, le système Hashmask peut se synchroniser à partir d'une phrase prise dans un livre commun aux deux communicants. Il suffit de transmettre les indications avec le nom du fichier crypté. Exemple P6L11.chs qui voudra dire Page 6 Ligne11 du livre commun aux deux communicants.
HashMask Lite ou HashMask 256
Il s'agit du même système en faisant l'impasse sur le mélange du tableau de substitution. Celui-ci reste donc une simple table ASCII et dans ce cas, toute la sécurité repose uniquement sur la non réversibilité du SHA-256.
Vous pouvez déjà le tester sur cette page avec des fichiers inférieurs à 500 ko.
Si vous avez une idée d'attaque autre que par force brute sur la clé , n'hésitez pas à nous en parler.
HashMask Lite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Copyright © 2012 P.Lheureux (lheureux[a]free.fr) & D.Mestdagh (dimitri.mestdagh[a]laposte.net)
HashMask 512
Suite à la cryptanalyse de Christophe Henry concernant HashMask Lite, nous allons maintenant faire en sorte qu'un masque utilisé pour déchiffrer un fichier ne puisse jamais servir à en déchiffrer un autre. La solution est simple , presque évidente même. Elle consiste à incorporer le SHA-256 du fichier clair ( fichier à chiffrer ) dans la routine de création du masque. Ce SHA-256 ( qui ne renseigne en rien sur le contenu du clair ) sera incorporé en début du fichier chiffré pour permettre le déchiffrement. Il est donc transmis avec le chiffré.
On passe aussi au SHA-512 pour le reste du masque. La substitution finale des paires du masque intermédiaire par le caractère ASCII correspondant reste inchangé.
La formule retenue pour la création du masque intermédiaire est la suivante.
SHA-256(du fichier à chiffrer) = 8757c04557511c1af428e9690c6495733f535423122168caa8a7927967173ac8
Clé=Le lutin bleu
Création du masque
SHA-512 (Chaine1concaténée avec la clé)=masque intermédiaire
Chaine1=SHA-512(SHA-256 du fichier à chiffrerconcaténé avec le Le lutin bleu) =
SHA-512(8757c04557511c1af428e9690c6495733f535423122168caa8a7927967173ac8Le lutin bleu) =
49838ce70dcac8f16cc186482080ea01d22b63259b27dd119c9e01f14acd198d3054c589d80675777814c6c9a17942a54c8569fd3f58e7945f1a7e1a6cf664d8
Début masque intermédiaire = SHA-512(49838ce70dcac8f16cc186482080ea01d22b63259b27dd119c9e01f14
acd198d3054c589d80675777814c6c9a17942a54c8569fd3f58e7945f1a7e1a6cf664d8Le lutin bleu)=
866644bda7729c1f263848af3258a137708d2b5e6d50b3436f889962317e100d13c0644fb2af66aab02cf9778d413e69e5f17943156ba236cb2c363bd546ce82
et ainsi de suite
SHA-512 (866644bda7729c1f263848af3258a137708d2b5e6d50b3436f889962317e100d13c0644fb2af66aab02
cf9778d413e69e5f17943156ba236cb2c363bd546ce82Le lutin bleu) = etc .
Le vecteur d'initialisation, c'est à dire le SHA-256 du fichier clair n'est utilisé (en combinaison avec la clé) que pour générer la première Chaine1. Les 64 premiers caractères du fichier chiffré transmis pour déchiffrage ne seront en fait que le SHA-256 du fichier clair. Ils serviront à l'initialisation du masque et à la vérification finale de l'intégrité du fichier déchiffré.
Avec cette méthode, une même clé pourra chiffrer des milliers de fichiers différents avec un risque vraiment minime de générer un masque identique pour deux fichiers. Merci aux fonctions de Hachage.
Dernière précision , l'extension des fichiers chiffrés devient .hmk
Une image valant mieux que mille mots , voici les schémas du principe:
Elle n'est pas belle la vie :-)
HashMask 512 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Copyright © 2012 P.Lheureux (lheureux[a]free.fr) & D.Mestdagh (dimitri.mestdagh[a]laposte.net)