| ALGORITHME RH | |||||
| Création des clefs de session | Chiffrement de 'c1' : 1re partie de 'c' | Chiffrement de 'c2' : 2e partie de 'c' | |||
| Explication | Codes | Explication | Codes | Explication | Codes |
| Explication du chiffrement de 'c1' | |||||
('c = c1 || c2')
'Algorithme RH' :
'RH' pour le nom de son auteur 'Raymond Houle'.
Tous les droits sur cet 'algorithme RH' (en partie ou en
totalité et cela à partir
de son développement jusqu'à son achèvement dans la version 3
et+ d'AllCrypter) sont réservés.
Cet algorithme est constitué d'au moins deux parties: la 1re partie (c1) qui contient toutes les données à chiffrer (pouvant contenir une fiche d'information), et la 2e partie (c2) qui contient les 2 clefs de session chiffrées (plus d'autres informations) à partir de la clef personnelle (clef secrète de l'utilisateur).
Voici les étapes pour le chiffrement de 'm' dans le chiffré 1 (c1): le chiffrement de la 1re partie de l'algo RH contient les données (m) à chiffrer et les données d'une fiche d'information personnelle d'AllCrypter (v.3+). Ci dessous, les étapes du chiffrement de 'm' sont détaillées; les mêmes étapes sont valables pour le chiffrement de la fiche d'information (fic); le chiffré de 'fic' est ajouté au bout du chiffré de 'm' pour former 'c1'.
Il est sous-entendu que les 2 clefs de session utilisées pour chiffrer 'm' sont premièrement créées aléatoirement à chaque fois qu'un chiffrement est exécuté, même si 'm' est identique d'un chiffrement à l'autre. Le procédé de création des clefs de session est expliqué dans un autre exposé ainsi que le chiffrement de 'c2'. Donc, ne pas confondre les 2 clefs de session créées automatiquement (et qui sont différentes d'un chiffrement à l'autre) d'avec la clef personnelle que l'utilisateur s'invente (et qu'il peut utiliser plusieurs fois selon son bon plaisir). L'utilisateur n'a pas à s'occuper des 2 clefs de session qu'il n'a pas à connaître, mais il n'a qu'à retenir sa clef personnelle (clef secrète).
Voici
quelques définitions pour aider à comprendre cet exposé:
- k =
clef personnelle et secrète (caractères choisis par
l'utilisateur servant au chiffrement des 2 clefs de session
finales et d'autres informations). Influence les calculs lors de
la génération aléatoire de 'sia' et 'sib', et détermine leur
taille.
- sa =
première clef de session complète.
- sb =
deuxième clef de session complète.
- sia =
première clef de session initiale (les premiers caractères de
'sa' générés au hasard; jamais les mêmes). 'sia' est de la
même taille que 'k'.
- sib =
deuxième clef de session initiale (les premiers caractères de
'sb' générés au hasard; jamais les mêmes). 'sib' est de la
même taille que 'k'.
- sfa =
première clef de session finale (les derniers caractères de
'sa' qui sont conservés pour être chiffrée dans le 2e chiffré
(c2) : la 2e partie de 'c'). 'sfa' est de la même taille que
'k'.
- sfb =
deuxième clef de session finale (les derniers caractères de
'sb' qui sont conservés pour être chiffrée dans le 2e chiffré
(c2) : la 2e partie de 'c'). 'sfb' est de la même taille que
'k'.
- m =
données à chiffrer de la 1re partie de 'c1'.
- bro()
= fonction qui incrémente et brouille les données.
- bro(m)
= données incrémentées et brouillées.
- per()
= fonction qui permute les données.
- per(m)
= données permutées.
- per(bro(m)) = données incrémentées/brouillées et
permutées.
- c =
données totales chiffrées comprenant c1 et c2.
- c1 =
données chiffré de la 1re partie de 'c' : contient les données
de 'm' chiffré et de 'fic' chiffré.
- c2 =
données chiffrées de la 2e partie de 'c' : contient le chiffré
de 'sfa', de 'sfb', et d'autres informations spéciales à être
utilisées lors du déchiffrement.
- ca =
caractères choisis aléatoirement dont la quantité est
déterminée par exemple pour combler un multiple de 4 ou de 8
dans l'ensemble des données à chiffrer.
- f =
fonction produisant 'c'.
- f1 =
fonction produisant 'c1'.
- f1a =
fonction produisant le chiffrement de 'm'.
- f1b =
fonction produisant le chiffrement de 'fic'.
- f2 =
fonction produisant 'c2'.
- || =
et.
- sa>
= caractère de droite de 'sa'; le '>' est valable pour toutes
chaînes de caractères: 'sa>', 'sb>', etc.
- sa_3 =
3e caractère de 'sa'.
- sa_3> = chiffre de droite du nombre ascii du 3e
caractère de 'sa'. Exemple: si 'sa' = "ab25" alors
'sa_3' est 2 dont le nombre ascii est '50'. Donc, 'sa_3>'
équivaut à '0' (le chiffre de droite du nombre '50').
- sa>
= dernier caractère (à droite) de 'sa'.
- sa>+ = caractère qui s'ajoute à la suite du
caractère de droite dans 'sa'.
- sa<+ = caractère qui s'ajoute avant le premier
caractère de gauche dans 'sa'.
- sa_> = même signification que 'sa_3>' à
l'exception que le caractère n'est pas définie; on met donc
l'accent sur le chiffre de droite du nombre ascii d'un caractère
quelconque.
- sa>> = chiffre de droite du nombre ascii du
dernier caractère (à droite) de 'sa'.
- sa_2<| = signifie qu'il sagit de l'avant
dernier caractère de la chaîne de caractères qui se trouve
dans 'sa'; le 2e caractère avant la fin de 'sa'.
Dans son ensemble, l'ago RH peut se définir
de différentes façons que voici:
c = c1
|| c2
c = c1a || c1b || c2
f() = f1() || f2()
f() = f1a() || f1b() || f2()
c = f(m || fic || InfoS, k)
c1 = xor(cox(bro(inv(m))) || cox(bro(inv(fic))), (sa + sb) mod
256)
c = xor(cox(bro(inv(m))) || cox(bro(inv(fic))), (sa + sb) mod
256) || c2
Voici, étape par étape, un exemple de chiffrement
pour la 1re partie de 'c1', c'est-à-dire 'xor(cox(bro(inv(m))),
(sa + sb) mod 256)':
Supposons que nous ayons...
- la clef personnelle suivante:
k = 'abcdefghijklmnop' = 097-098-099-100-101-102-103-104-105-106-107-108-109-110-111-112-
Parce que 'k' a une taille de 16 caractères
alors les 2 clefs de sessions 'sia' et 'sib' sont créées avec
une taille de 16 caractères chacune.
- la 1re clef de session initiale suivante:
sia = '0123456789101112' = 048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-
- la 2e clef de session initiale suivante:
sib = '1314151617181920' = 049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-
- les caractères de 'm' suivants à chiffrer:
m = 'Message secret' = 077-101-115-115-097-103-101-032-115-101-099-114-101-116-
Dans
toutes les étapes, les caractères de 'k', de 'sia', de 'sib'
et de 'm' seront convertis et utilisés en
nombre ascii pour question de clarté, puisque autrement certains
caractères spéciaux ne pourraient pas s'afficher ici. Donc, se
référer à la table des 256 caractères ascii (0 à 255) pour
connaître les caractères correspondant à leur nombre ascii.
À noter aussi que tous les nombres ascii qui
dépasseront le nombre 255 peuvent être diminués avec le 'modulo 256'; mais dans cet exposé le 'modulo'
sera fait à la fin lors de la dernière étape ou lorsque cela
pourrait être nécessaire pour ne pas fausser les données
numériques ascii ou pour une meilleure compréhension.
ÉTAPE
1:
inversion de chaque caractère de 'm': donc, 'm2 = inv(m)'.
Le dernier caractère devient le 1er, l'avant
dernier caractère devient le 2e, etc. Donc,
m = '077-101-115-115-097-103-101-032-115-101-099-114-101-116-'
devient
m2 = '116-101-114-099-101-115-032-101-103-097-115-115-101-077-'
Ainsi, 'm2 = inv(m)'.
ÉTAPE
2:
brouillage de chaque caractère ascii de 'm2' par
incrémentation, combinaison et addition: donc, 'm3 = bro(m2)'.
On incrémente (inc) de 'un' chaque
caractères de 'm2' puis on additionne d'autres valeurs à 'm2'
pour enfin obtenir 'm3'.
Ceci est pour diversifier d'avantage les
futurs caractères ajoutés aux 2 clefs de session dans le cas
où 'm' comportait plusieurs caractères ascii zéro de suite
(comme c'est le cas pour certains fichiers vidéo).
Le procédé d'incrémentation débute avec la
valeur zéro, ensuite on continue avec 1, puis 2, etc. ; on
ajoute 1 de plus à chaque caractère de 'm2' qui suit. Après le
nombre 255 on recommence le cycle avec la valeur zéro.
On procède au brouillage en additionnant le
1er caractère de 'm2', le chiffre de droite du 2e caractère
ascii de 'sa' combiné au chiffre de droite du 4e caractère
ascii de 'sb', la valeur incrémentale et la valeur ascii du
xème caractère de 'sb' dont le chiffre de droite (additionné
à 7) du 4e caractère ascii de 'sb' indique (ce chiffre de
droite sélectionne un caractère parmi les 10 caractères allant
du 7e au 16e caractère de 'sb'; on obtient donc une valeur
permutée). Dans notre exemple ci-dessous, les 2 valeurs
combinées sont '9' (dans 'sa') et '2' (dans 'sb') produisant
ainsi '92'; le caractère de droite de '92' est '2', et on
additionne donc 7 à 2 pour obtenir 9 lequel indique le 9e
caractère de 'sb'.
Dans notre exemple, en se servant de notre
formule (m3_1
= sa_2>||sb_4> + sb_7~16 + inc_1 + m2_1) on a l'addition suivante: '92 + 49 + 0 + 116' ('combinaison des chiffres de droite de
sa et de sb' + 'valeur permutée de sb' + 'valeur incrémentale' + 'm2').
sia = 048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-
sa mod 256 = 048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-084-152-128-081-116-168-023-045-210-228-169-080-123-066-
sib
= 049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-
sb mod 256 = 049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-080-147-136-040-140-007-067-065-026-079-037-234-043-006-
On ne
garde que le chiffre de droite de chaque nombre ascii de 'sa' et
'sb':
008-009-000-001-002-003-004-005-006-007-009-008-009-009-009-000-004-002-008-001-... = chiffre de droite des nombres ascii
de 'sa
mod 256'; (sa_1>,
sa_2>, sa_3>, etc.).
009-001-009-002-009-003-009-004-009-005-009-006-009-007-000-008-000-007-006-000-... = chiffre de droite des nombres ascii
de 'sb
mod 256'; (sb_1>,
sb_2>, sb_3>, etc.).
092-009-013-029-034-049-055-069-076-099-087-090-098-090-007-046-020-... = combinaison de ces 2 chiffres de
droite de 'sa_>' et 'sb_>'.
On additionne ce résultat aux données 'm2', 'sb_7~16' et 'inc'
(valeurs incrémentales):
092-009-013-029-034-049-055-069-076-099-087-090-098-090- = 'sa_2>||sb_4>', 'sa_3>||sb_5>', etc.
049-080-056-136-050-140-147-067-140-026-065-147-037-040- = 'sb_7~16'.
000-001-002-003-004-005-006-007-008-009-010-011-012-013-
= 'inc' (valeurs incrémentales).
116-101-114-099-101-115-032-101-103-097-115-115-101-077-
= 'm2'.
257-191-185-267-189-309-240-244-327-231-277-363-248-220- = 'm3' (total).
001-191-185-011-189-053-240-244-071-231-021-107-248-220- = 'm3 mod 256' (total).
Les caractères manquant de 'sa' et 'sb' sont
trouvés grâce à l'étape 3 mais ils ont été ajoutés à
l'avance ici pour faire plus simple dans le calcul de cette
étape 2.
Donc, pour avoir trouvé ces quelques
caractères manquant de 'sa' et 'sb', nous devrons, à l'étape
3, prolonger les 2 clefs de sessions 'sa' et 'sb' pour ensuite
pouvoir continuer le calcul de cette étape-ci.
Dans la procédure normale, à cet étape 2,
on 'brouille' la 1re colonne, ensuite (via l'étape 3)
on prolonge d'un caractère les 2 clefs de sessions 'sa' et 'sb',
puis (à cet étape 2) on 'brouille' la 2e colonne,
ensuite (à l'étape 3) on prolonge d'un autre
caractère les 2 clefs de sessions 'sa' et 'sb', et ainsi de
suite jusqu'au dernier caractère de 'm2'.
On doit donc prolonger les 2 clefs de sessions
'sa' et 'sb' pour pouvoir continuer le brouillage de 'm2' au
complet. Lorsque 'm2' est 'brouillé' alors cela produit 'm3';
donc 'm3
= bro(m2)' ou 'm3 = bro(inv(m))'.
ÉTAPE 3: prolongement des 2 clefs de session 'sia' et 'sib': 'pro(sia||sib)'; donc, 'sa = pro(sia)' et 'sb = pro(sib)'.
Les 2
clefs de session 'sa' et 'sb' doivent avoir une taille
supérieure à celle de 'm', c'est-à-dire que la taille qui
excède doit être équivalente à celle de 'k'. Ces caractères
qui excèdent dans 'sa' et 'sb' correspondent à la taille de
'sfa' et 'sfb'. Donc, 'sia' et 'sib', 'k', 'sfa' et 'sfb' ont
toujours la même taille, toujours le même nombre de
caractères.
Voici la formule pour prolonger 'sia' et 'sib'
sous l'influence de 'm3':
'((sa_1
+ sa_7) xor (sa_13 + m3_1)) mod 256 = sa>+' (dernier octet ajouté à 'sa').
'((sb_1
+ sb_3) xor (sb_5 + m3_1) ) mod 256 = sb>+' (dernier octet ajouté à 'sb').
Donc pour 'sa', la somme des 1er et 7e
caractères de la clef 'sa' est ixorée avec la somme des 13e
caractère de la clef 'sa' et du 1er caractère de 'm3'; on fait
de même avec le caractère suivant, et ainsi de suite jusqu'au
dernier caractère de 'm3'.
Pour 'sb', la somme des 1er et 3e caractères
de la clef 'sb' est ixorée avec la somme des 5e caractère de la
clef 'sb' et du 1er caractère de 'm3'; on fait de même avec le
caractère suivant, et ainsi de suite jusqu'au dernier caractère
de 'm3'.
La création (le prolongement) de
'sa' et 'sb' est donc INFLUENCÉE par 'm3'.
Voici ici les données nécessaires qui ont
été utilisées à l'étape 2. Nous continuons à les utiliser
à cette étape 3:
sia = 048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-
sib = 049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-
m3 = 001-191-185-011-189-053-240-244-071-231-021-107-248-220-
(048 + 054) xor (049 +
001) = 084
sa = 048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-084-
(049 + 049) xor (049 +
001) = 080
sb = 049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-080-
(049 + 055) xor (049 +
191) = 152
sa =
048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-084-152-
(051 + 052) xor (053 +
191) = 147
sb =
049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-080-147-
(050 + 056) xor (049 +
185) = 128
sa =
048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-084-152-128-
(049 + 049) xor (049 +
185) = 136
sb =
049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-080-147-136-
(051 + 057) xor (050 +
011) = 081
sa =
048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-084-152-128-081-
(052 + 053) xor (054 +
011) = 040
sb =
049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-080-147-136-040-
(052 + 049) xor (084 +
189) = 116
sa =
048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-084-152-128-081-116-...
(049 + 049) xor (049 +
189) = 140
sb =
049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-080-147-136-040-140-...
On
continue les calculs pour le prolongement de 'sa' et 'sb'
jusqu'au dernier caractère de 'm3'.
On a maintenant les caractères manquant de
'sa' et de 'sb' afin de trouver les autres caractères de 'm3'.
Ainsi, le calcul de 'm3' complété, on obtient:
001-191-185-011-189-053-240-244-071-231-021-107-248-220- = 'm3 mod 256'.
Lorsque les calculs de cette étape 3 sont
terminés,
'sa mod 256' devient:
048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-084-152-128-081-116-168-023-045-210-228-169-080-123-066-
et 'sb mod 256' devient:
049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-080-147-136-040-140-007-067-065-026-079-037-234-043-006-
Ainsi, 'sia'
est:
048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-
et 'sib' est:
049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-
'sfa mod 256' à ce stade est:
049-050-084-152-128-081-116-168-023-045-210-228-169-080-123-066-
et 'sfb mod 256' à ce stade est:
050-048-080-147-136-040-140-007-067-065-026-079-037-234-043-006-
ÉTAPE
4:
Ixoration de 'm3' avec le chiffre de droite du 10e caractère
ascii de 'sa' combiné au chiffre de droite du 2e caractère
ascii de 'sb', produisant ainsi 'm4': 'm4 =
cox(bro(inv(m)))' ou 'm4 = cox(m3)'.
'cox' pour 'co' et 'x'; 'co' signifiant 'combinaison' (2
chiffres combinés de 'sa_10' et 'sb_2'), et 'x' signifiant
'xor'.
Donc, 'm4_1
= ((sa_10>
|| sb_2>) xor m3_1) mod 256':
'sa mod 256' = '048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-084-152-128-081-116-168-023-045-210-228-169-080-123-066-'
'sb mod
256' = '049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-080-147-136-040-140-007-067-065-026-079-037-234-043-006-'
'm3'
= '001-191-185-011-189-053-240-244-071-231-021-107-248-220-'
Dans
notre exemple ici, on joint le chiffre de droite (7) du nombre ascii du 10e caractère
de 'sa' ('057' dans notre exemple) et le chiffre de droite
(1) du nombre ascii du 2e caractère de
'sb' ('051' dans notre exemple). On ixore le
résultat de la combinaison ('71' dans notre exemple) avec le 1er
caractère de 'm3'
('001' dans notre exemple), et le
caractère qui en résulte (ascii '070') devient le 1er caractère de 'm4': donc, '71' xor '001' = 070 .
On
poursuit en joignant le chiffre de droite (9) du nombre ascii du 11e caractère
de 'sa' ('049' dans notre exemple) et le chiffre
de droite (9) du
nombre ascii du 3e caractère de 'sb' ('049' dans notre exemple). On ixore le
résultat de la combinaison ('99' dans notre exemple) avec le 2e
caractère de 'm3'
('191' dans notre exemple), et le
caractère qui en résulte ('220') devient le 2e caractère de 'm4': donc, '99' xor '191' = 220 .
On
continue ainsi jusqu'au dernier caractère (220) de 'm3', et le résultat final devient 'm4'.
Voici 'm4' produit à partir de 'm3':
'm4' = '070-220-235-104-224-086-244-197-094-190-005-046-175-194-'
ÉTAPE
5:
Ixoration finale de 'm4'
avec la somme des 2 clefs de session 'sa' et 'sb' produisant
'm5':
'm5 =
xor(cox(bro(inv(m))), (sa + sb) mod 256)' ou
'm5 = xor(m4, (sa +
sb) mod 256)' .
Dans cette dernière étape du chiffrement de
la première partie de 'c1' (donc, de 'c1a'), dans notre
exemple, on additionne le 17e caractère de 'sa' avec le 6e
caractère de 'sb', puis on ixore ce résultat avec le 1er
caractère de 'm4';
puis avec ce résultat, on fait un 'modulo 256' pour s'assurer de
demeurer dans une plage ascii de 256 (donc, de 0 à 255). On a
donc un décalage de 17 caractères et un autre de 6 caractères
dans le calcul entre les 2 caractères des 2 clefs de session et
celui de 'm4'.
On définit le calcul du 1er caractère ainsi:
'm5_1 =
((sa_17 + sb_6) xor m4_1) mod 256'.
'sa mod
256' = '048-049-050-051-052-053-054-055-056-057-049-048-049-049-049-050-084-152-128-081-116-168-023-045-210-228-169-080-123-066-'
'sb mod
256' = '049-051-049-052-049-053-049-054-049-055-049-056-049-057-050-048-080-147-136-040-140-007-067-065-026-079-037-234-043-006-'
'm4' = '070-220-235-104-224-086-244-197-094-190-005-046-175-194-'
Donc, '((sa_17 + sb_6) xor m4_1) mod 256 = m5_1':
((084 + 053) xor 070)
mod 256 = 207
((152 + 049) xor 220)
mod 256 = 021
...ainsi de suite jusqu'au dernier caractère de 'm4'.
On obtient donc comme résultat le chiffré
suivant de la 1re partie de 'c1' :
'm5' = '207-021-093-234-075-143-187-155-085-168-220-142-161-008-'
On aurait
pu fusionner les étapes 4 et 5 en utilisant la formule de calcul
suivante: 'm4_1 = ((sa_10> || sb_2>) xor (sa_17 +
sb_6) xor m3_1) mod 256'
.
Pour chiffrer la 2e partie ('fic') de 'c1'
(donc 'c1b'), on procède de la même façon que toutes ces 5
étapes ci-dessus, puis on joint cette 2e partie de 'c1' ('c1b')
à la suite de cette 1re partie de 'c1' ('c1a'). Les 2 clefs de
session finales de la 1re partie de 'c1' ('c1a') sont les 2 clefs
de session initiales servant au chiffrement de la 2e partie de
'c1' ('c1b'; 'fic': la fiche d'information).
Les 2 clefs de session finales de la 2e partie
de 'c1' (donc 'c1b') (et d'autres informations nécessaires)
sont chiffrées via la clef personnelle ('k') de l'utilisateur,
ce qui produit ainsi 'c2' qu'on joint à la suite de 'c1'. Cliquez
ici pour
l'explication des étapes du chiffrement de 'c2', sachant que
'c1' et 'c2' forment 'c'.
Donc, ce
qui est connu du public est seulement le chiffré (cryptogramme)
ainsi que l'algo RH servant à la création du cryptogramme. 'k'
doit comporter un minimum de 16 caractères, et les 2 clefs de
session ne sont utilisées qu'une seule fois, même si on chiffre
les mêmes données plus d'une fois. Le but de cet 'algo RH'
étant que personne ne puisse déchiffrer (décrypter) un
cryptogramme sans la clef personnelle (k) secrète de
l'utilisateur, même en faisant connaître publiquement
l'algorithme utilisé ou en exerçant en dehors de l'attaque à
force brute les différentes attaques dont les cryptanalystes se
servent.
C'est un système à clefs de session jetables
automatiquement (faisant penser à celui de Vernam '1917'). Les 2
clefs de session ('sa' et 'sb') générées automatiquement sans
que l'utilisateur s'en occupe ne sont donc jamais utilisées 2
fois, mais la clef secrète personnelle (k) de l'utilisateur peut
être utilisée autant de fois que désiré.
Raymond H.
www.allcrypter.com