HMK v.03

Chiffrement par flot. Démonstration online.

Principe de base

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.

Principe de fonctionnement :

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.

Chiffrement en fonction d'une clé

  1. Construction d'un masque-clé à partir d'un hash SHA

    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. Ce vecteur d'initialisation sera ensuite indiqué (en clair) dans le fichier chiffré.

    Hash initial = SHA-512 (clé utilisateur + vecteur d'initialisation)

    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

    Vecteur d'initialisation = 5mOi('2q<9sp1aRbHz

    Hash initial = SHA-512 (Maclédechiffrement5mOi('2q<9sp1aRbHz)

    Hash initial =

    c0499f1a0aa4f91f48fa493e8498af86235599cdeb0d049f0ef84c82698530fde070647cd6520f055adc37ea72231569789576ef90a258c1944652f3605db7b0

    Masque intermédiaire = SHA-512 (c0499f1a0aa4f91f48fa493e8498af86235599cdeb0d049f0ef84c82698530fde070647cd6520f055adc37ea72231569789576ef90a258c1944652f3605db7b0Maclé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.

  2. Chiffrement du clair par masque-clé

    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 chiffrement
    Principe de chiffrement
    Principe de déchiffrement

  3. Création du fichier chiffré

    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 HMK :

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 :