L'idée de base est de produire un chiffre insensible à toute autre attaque que celle à la force brute.
Grâce à une première clé utilisant des intervalles de longueurs variables, chaque caractère ascii à chiffrer est chiffrable avec plus de 3000 valeurs différentes comportant 6 chiffres.
Grace une deuxième clé variable en longueur, les 6 chiffres du nombre extrait de l'intervalle sont ensuite mélangés puis incorporés chiffre par chiffre à l'intérieur d'un nombre aléatoire de 16 chiffres.
A chaque caractère chiffré, la première clé et la deuxième clé sont soumises à une évolution pour assurer l'invulnérabilité du chiffre produit.
L'intervalle général de travail à prendre en compte se situe entre 100000 et 999999 compris. Ce qui fait 900000 possibilités pour coder l'ensemble des 256 caractères de la table ASCII étendue.
La moyenne par caractères ASCII est donc de 900000/256 = 3515 possibilités de chiffrage différents.
Le premier but à atteindre est la création d'un tableau à deux dimensions faisant coïncider chacun des caractères ASCII avec un intervalle bien précis.
Afin de compliquer la cryptanalyse, les intervalles doivent être variables et les cases du tableau des caractères ASCII remplies avec un ordre ALEATOIRE.
La variabilité d'un intervalle est de 515 numéros.
Remplir le tableau de 1 a 255 avec un algorithme fixant la valeur BORN_MIN de chaque intervalle.
La valeur de départ étant : BORN_MIN(0) = 100000
BORN_MIN(1) = 100000 + 3000 + (un chiffre pris au hasard entre 0 et 515)
BORN_MIN(2 )= BORN_MIN(1) + 3000 + (un chiffre pris au hasard entre 0 et 515)
Et ainsi de suite, jusqu'à BORN_MIN(254). La 256ème case du tableau (qui va de l'indice 0 à l'indice 255) contiendra donc plus de 3515 possibilités de chiffrage.
BORN_MAX(255)= forcément 999999
En ce qui concerne la répartition des caractères ASCII affectés à chaque intervalle, il faut aussi que les cases soient remplies au hasard.
Exemple :
CARACTERE(0)=195 (195 est le code du caractère ASCII )
CARACTERE(1)=62
CARACTERE(2)=69
CARACTERE(3)=47
Et ainsi de suite jusqu'à ce que les 256 cases soient remplies avec des valeurs différentes.
Une fois le tableau crée, n'importe quel caractère ASCII de la table étendue pourra être chiffré par une des valeurs prise au hasard entre les valeurs BORN_MIN et BORN_MAX .
Admettons que le caractère B corresponde à un indice du tableau dont l'intervalle affecté est situé entre 258967 et 262367, tous les chiffres compris entre 258697 et 262366 inclus pourront servir pour le chiffrer.
Le numéro à 6 chiffres (extrait le plus possible au hasard dans l'intervalle des 3000 numéros minimum possibles correspondants au caractère ASCII à chiffrer) va maintenant subir une série de transformations destinées à brouiller les pistes.
Le principe de base consiste à mélanger l'ordre des 6 chiffres extraits puis d'incorporer ceux-ci dans un numéro aléatoire composé de 16 chiffres.
Exemple de transformation du numéro 548973 :
A) Création d'une clé de 16 caractères montrant l'ordre et la position de la séquence de chiffres du numéro extrait a l'intérieur d'un numéro aléatoire.
XX5XX43XX6X1XX2X
Les X sont destinés à être remplacés par des chiffres aléatoires entre 0 et 9,
1 correspond a la position du 1 er chiffre du numéro extrait (5)
2 correspond a la position du 2 ème chiffre du numéro extrait (4)
3 correspond a la position du 3 ème chiffre du numéro extrait (8)
4 correspond a la position du 4 ème chiffre du numéro extrait (9)
5 correspond a la position du 5 ème chiffre du numéro extrait (7)
6 correspond a la position du 6 ème chiffre du numéro extrait (3)
B) incorporation
XX5XX43XX6X1XX2X devient donc après injection des chiffres du numéro extrait XX7XX98XX3X5XX4X
C) masquage aléatoire
Puis enfin : 4770698113450747 ou encore : 1578198473950040 en remplaçant les X par de l'aléatoire.
Bien entendu, celui qui a la clé pourra facilement extraire puis remettre en ordre les chiffres du numéro extrait dans l'intervalle.
Sans la clé XX5XX43XX6X1XX2X, l'opération s'avère cependant délicate.
Cette clé sera bien sur rajoutée à la première clé contenant la position des caractères ASCII et les intervalles.
A ce stade, il reste encore une petite faiblesse liée au fait que compte tenu des numéros extraits dans les intervalles, presque 3 ou 4 chiffres sur 6 restent identiques pour un même caractère chiffré en continu. Même incorporés dans de l'aléatoire, on pourrait finir par les repérer statistiquement. Cela ne donnerait pas l'ordre pour autant mais autant ne laisser aucune trace exploitable.
Afin d'éviter de pouvoir repérer les 3 ou 4 chiffres qui restent identiques à chaque même caractère chiffré, il suffit d'appliquer quelques principes complémentaires.
A chaque caractère chiffré, il faut décaler le tableau de base pour que le prochain caractère qui doit être chiffré saute d'au moins un intervalle.
Pour procéder, on utilise alors l'intervalle attribué à la valeur du caractère suivant dans la table ASCII étendue. Les valeurs des caractères ayant été réparties aléatoirement dans le tableau d'intervalle, les premiers chiffres des numéros extraits dans les intervalles varient donc constamment, même en cas de répétition d'un même caractère dans le texte original.
Au lieu de générer une simple clé de 16 caractères gérant l'ordre et la position des chiffres incorporés, on va fabriquer une clé de x fois 16 caractères, de manière aléatoire également.
Admettons que l'on ait x à 21, cela créera une clé comportant 21 séquences différentes de 16 positions + ordre.
XX5XX43XX6X1XX2X ( clé 1)
156XXXXXXXXX342X ( clé 2)
XX216XXXXXXXX543 (clé 3)
Etc. Le premier caractère chiffré utilise la clé 1, le deuxième la clé 2, le 21ème utilise la clé 21 et le 22ème, la clé 1.
C'est ce changement de clé permanent, associé au décalage de la table, qui va engendrer la meilleure sécurité du chiffre produit. Pour procéder, on créera un nombre de clés dans un intervalle situé entre 32 et 64 clés consécutives.
La clé finale se composera donc de la table associant caractères ASCII avec intervalles + x fois la clé d'ordre et de position permettant l'extraction de ce qui a été incorporé dans le masque/clé.
Les caractères "X" placés dans les masques/clés seront quand à eux remplacés par des caractères aléatoires (action de maquillage) afin de compliquer la lecture de la clé si elle devait toutefois être interceptée (aucune influence sur le cryptage).
Afin d'éviter de retrouver un même chiffre au même emplacement (dans les séquences de 16 chiffres issues du chiffrement par masques/clés) dans le texte chiffré en sortie, il sera bon d'ajouter un chiffre aléatoire positionné à un emplacement différent dans chacune de ces séquences.
Ainsi, il sera d'autant plus difficile d'identifier correctement les séquences produites à partir des clés, sans connaître l'emplacement du caractère "intrus" dans les séquences de 17 chiffres, ce même une fois que toutes les clés auront été utilisées et que la boucle sur les clés aura été entammée pour le chiffrage.
Pour procéder, on définira (toujours de manière aléatoire) un emplacement de départ dans la séquence (de 1 à 16) pour le caractère intrus, puis on décalera cet emplacement à chaque séquence de 17 chiffres générée, en fonction de la valeur d'un des chiffres de la clé suivante. Le décalage sera ainsi différent pendant toute la phase de chiffrage.