L'idée de base est de produire un chiffrement de taille sensiblement égale au fichier chiffré, et qui soit insensible à toute autre attaque que celle de la force brute (en rendant la cryptanalyse impossible), et ce en respectant une taille de clé de chiffrement "standard". Le volume des données chiffrées devra être de taille sensiblement équivalente au volume des données à chiffrer, à quelques octets près.
Création d'une clé de 128 bits, 256 bits, ou 512 bits :
La clé ne devra contenir que des caractères ASCII "imprimables" afin qu'elle puisse être écrite manuellement.
On crée une clé composée de caractères imprimables (92 caractères dans la table ascii standard), de préférence alphanumériques :
Ce qui nous donnera pour chaque fichier clé :
Possibilité d'utilisation d'une passphrase composée de caractères imprimables (minimum 16 caractères) en remplacement d'une clé générée aléatoirement.
La formule retenue pour la création du masque intermédiaire est la suivante :
Pour commencer, on crée une clé aléatoire de la même longueur que la clé utilisateur comme vecteur d'initialisation pour la suite du calcul du masque. Cette clé aléatoire sera ensuite indiquée (en clair) dans le fichier chiffré.
Hash initial = SHA-512 (clé utilisateur + clé aléatoire)
Ce hash initial n'est cependant pas utilisé pour masquer le clair, il sert simplement de chaîne de base pour la formule de création du masque intermédiaire.
On crée ensuite un masque intermédiaire du double de la longueur du contenu du fichier original, en répétant la formule suivante autant de fois que nécessaire :
SHA-512 ( [Hash précédent] + clé utilisateur) = masque intermédiaire
Exemple :
Clé : Maclédechiffrement
Clé aléatoire = 5mOi('2q<9sp
Hash initial = SHA-512 (Maclédechiffrement5mOi('2q<9sp)
Hash initial =
a81e6b9285b5ed528241332ec022d0bc81335e78e2602bbff6e33647f0598af2e5f0b5d1a64e5726738fdeff8f9dd009fd619c2366c57304996da96c516b8b2
Masque intermédiaire = SHA-512 (1b97f30b90ee00d658a8362d8ee2ff952731ed91e425f26de4547b65c38374d09f30df738628741897a1128fb33e9d05f0d0006ee30696f0f6f1297b4e826901Maclédechiffrement) soit :
2bb38bdb4ef3a0a51501a5dc732899b334f6a0a199103320f19c4de00115333950cc660b99544f3b88e92c52d340498e063f68a6b7fbc9d7dd09330be02d4bf3
Ce premier hash devient celui utilisé pour le calcul suivant de la suite du masque qui est :
SHA-512 (2bb38bdb4ef3a0a51501a5dc732899b334f6a0a199103320f19c4de00115333950cc660b99544f3b88e92c52d340498e063f68a6b7fbc9d7dd09330be02d4bf3Maclédechiffrement) soit :
911d97e47f836551639e72a21b0fa4a69f0417ea00f2099c75129429300418a3065892745fce68f091178d9b6d047de916b2f916745dcd70536116bd15f1bfb8
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 (ce qui peut être trop volumineux en termes d'espace mémoire), le traitement des données se fera par segments de 128 caractères (la longueur d'un hash SHA-512).
On découpe ensuite le masque intermédiaire en séries de deux caractères. On utilise alors la valeur de chaque paire obtenue (2 chiffres hexadécimaux, soit de 00 à FF) pour définir le code Ascii du caractère qui va constituer le masque définitif (soit des valeurs situées entre 0 et 256).
Exemple :
Hash : 947961d1b85703c0b918a06a70507f3d4e3a948f0b3cd61cb652a661a48a143b
Paires : 94, 79, 61, d1, b8, 57, 03, c0, ...
chr(94) = "^"
chr(79) = "O"
chr(61) = "="
chr(d1) = "Ñ"
chr(b8) = "¸"
Masque définitif = ^O=Ѹ...
Ainsi le masque définitif (ou masque véritable) va se construire progressivement tout en étant dépendant de la clé fournie au départ, et du contenu "clair" à chiffrer. Chaque hash généré servira à masquer 64 caractères du clair. On va donc générer au total : (taille du clair divisé par 64) hachages successifs différents.
On opère simplement un XOR sur les caractères du contenu "clair" et ceux du masque définitif.
Clair xor Masque = Chiffré
Et pour le déchiffrement
Chiffré xor Masque = Clair
![]() Principe de chiffrement |
![]() Principe de déchiffrement |
Avant de copier le contenu chiffré dans le fichier, on y place d'abord le vecteur d'initialisation (la clé aléatoire) qui servira comme paramètre de déchiffrement, ainsi que le SHA 256 du fichier original + la clé, qui servira à contrôler l'intégrité du fichier déchiffré.
Afin de transmettre un fichier au nom générique (on préserve le nom du fichier original lors des transferts) on stocke le nom du fichier clair dans le fichier chiffré. Pour éviter de situer à coup sûr le point et l'extension du nom de fichier dans le chiffré (ce qui pourrait constituer un point de départ pour une éventuelle cryptanalyse) on prendra la précaution de placer cette information à un emplacement pseudo-aléatoire dans le contenu chiffré.
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-512 :
- 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-512 qui génère un hash pseudo-aléatoire et unique (fonction de hachage irréversible et non cassée à ce jour).
- Chaque masque créé est propre à une clé utilisateur et à une clé aléatoire. Une même clé pourra donc être réutilisée un nombre infini de fois, sans toutefois générer deux masques de chiffrement identiques, et ce même pour deux fichiers rigoureusement identiques.
Seul celui qui connaît la clé peut reconstruire le masque et il semble impossible (en mai 2012) de remonter du masque vers la clé. La seule attaque possible est donc une attaque par force brute sur la clé.
Autres avantages :
- Le système ne nécessite pas de modifier la clé pour chaque fichier à chiffrer, puisque la clé aléatoire assure la modification totale du masque pseudo-aléatoire.
- Le poids du fichier en sortie est sensiblement égal à celui du clair, à quelques octets près (la clé aléatoire, le nom du fichier et les 10 caractères de contrôle CRC32 étant ajoutés lors du chiffrement).
- Une vérification d’intégrité du fichier déchiffré est réalisée automatiquement au déchiffrement.
- Le chiffrement et le déchiffrement sont relativement rapides.