Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Simple algo: création de la clef de session

55 réponses
Avatar
Raymond H.
Bonjour,

"Christophe HENRY" <forumslkm.sbgodin@nerim.net.sans_lkm> a écrit dans le
message de news: ctia8g$6td$1@biggoron.nerim.net...
> Le Sun, 30 Jan 2005 02:40:27 -0500, Raymond H. a écrit :
>
>> Bonjour,
>>
>> Aie-je bien raison de penser que dans ces deux exemples le xor
>> serait
>> moins difficiles à inverser (déchiffrer) que l'addition, même si le
>> nombre
>> de possibilités du xor dépasse celui de l'addition?
>
> Aucune difficulté dans chacune des deux possibilités.

Autrement dit, dans l'algo de Vernam il n'y aurait aucune différence qu'il
ait utilisé soit un xor ou une addition?

>Ce qui m'a ennuyé
> (sans rendre l'algo plus fort) est le mélange du xor et de l'addition.


Disons que pour le prolongement de la clef, je pense qu'il serait mieux
de mélanger les deux: car sinon on n'aurait que 256 possibilités tandis
qu'avec des additions on rend plus difficile le déchiffrage via
l'utilisation de l'algo (en inversion ou autre). Cela, dans l'optique où on
connaît déjà l'algo, afin de rendre aussi difficile l'inversion qu'une
attaque à force brute. C'est du moins ce que je conçoit.
Si ( 20 + 23 ) xor 22 = 61 , et qu'on soupçonne que la valeur
intermédiaire est 22 en ayant déjà le chiffré 61, il sera plus difficile de
trouver 20 que de trouver uniquement 43 (ici pensons à une attaque à clair
connue). Je parle concernant le prolongement de la clef. Mais concernant
le chiffrage je pense qu'un simple xor serait suffisant surtout si tout
repose sur la force de calcul du prolongement de la clef de session.

J'ai pris quelques temps pour ruminer quelle serait la façon la plus
simple et la plus certaine de faire l'algo. J'en suis venu à la conclusion
que si le seul algo incassable est celui de Gilbert Vernam en 1917, alors
pourquoi ne pas m'en inspirer pour faire quelque chose d'aussi certain qui
lui ressemble et tout en restant autant que possible aussi simple.
Il faut que je m'assure des points suivants:
1 - générer une clef imprévisible de la même longueur que le clair (une
seule clef par chiffrage).
2 - construire un algo générateur de clef (de session) interdisant une
attaque à clair connu (une entête connue via l'extension du fichier par
exemple).
3 - ne conserver que la partie finale de la clef de session qui doit servir
pour le déchiffrage; celle-ci et l'identificateur de la phrase de passe
(généré par la phrase de passe) doivent être chiffrés ensemble par la phrase
de passe afin de les ajouter au chiffré existant. L'algo chiffrant la
phrase de passe et la clef session finale doit être aussi sûr que celui qui
génère le prolongement de la clef de session (car les 1er caractères de la
clef de session est généré aléatoirement: clef de session initiale).
4 - si les 3 premiers points sont rencontrés, le chiffrage du clair par un
simple xor serait suffisant pour être aussi sûr que l'algo de Vernam.



Donc, un simple xor serait suffisant pour le chiffrage du clair; mais la
partie de l'algo générant (prolongeant) la clef de session devrait être plus
compliquer afin de créer des murs de feu dans celui-ci (dans '(Var1 + Var2)
xor Var3=255' l'addition serait un mur interdisant l'inversion); donc,
demandant une partie algorithmique plus compliqué (donc, à plusieurs
niveaux).
J'ai fais quelques tests pour savoir le nombre de possibilités à partir
de quelques calculs différents:
32896 possibilités: (V1 + V2 + V3)=255
65536 possibilités: (((V1 xor V2)xor V3)=255
256 possibilités: (V1 + V2)=255
256 possibilités: ((V1 xor V2)=28
128 possibilités: (k1+k1)xor k2=164
32896 possibilités: (k1+k2)xor k3=164
14652 possibilités: ((k1+k2)xor 53)+k3=164
1517673 possibilités: ((k1+k2)xor m1)+k3=164
0 possibilité: ((128+128)xor m1)+128=255
1 possibilité: (((128+128)xor m1)+128) Mod 256=255
165 possibilités: ((V1 xor V2)+V1=164
1 possibilité: ((V1 + 53)xor V1=255
203 possibilités: ((V1 + 53)xor V2=164
1 possibilité: ((V1 xor 53)=255
6724352 possibilités: (k1+k2)xor(k3+k4)=164
625364 possibilités: ((k1+k2+m1+m2)xor k2)+k1=164
1 possibilité: Var1 xor 64=255



J'ai fait des tests en codes de programmation pour voir quel calcul
rallonge la plus longue clef de session à partir d'une clef de session
initiale de seulement 4 caractères. J'ai mis des caractères ascii zéro (0)
pour le clair, puisqu'avec des caractères zéro il est plus difficile de
générer des caractères variés dans le rallongement de la clef de session.

k est la clef de session initiale. m est le clair (des caractères ascii
zéro; caractères Nul).
(k1+m1) xor (k3+k4)=k5 donne comme résultat un caractère de plus à ajouter à
la fin de la clef de session. Donc k=k & k5 La clef de session est donc
prolongée en étant influencé par le clair m1.


k=2222
m=0000...
(k1+m1) xor (k3+k4)=
050-050-050-050-086-186-034-238-070-142-246-106-038-030-178-186-074-026-214-074-106-174-206-054-110-010-182-246-194-178-194-130-134-186-130-190-198-062-134-122-198-126-194-058-058-010-134-170-010-190-078-166-254-026-086-214-210-178-210-082-246-250-034-078-134-046-150-138-166-030-082-250-234-250-182-074-234-206-014-150-078-042-118-054-226-050-098-162-230-186-194-222-070-158-038-026-006-190-226-186-154-234-102-234-202-094-078-070-094-250-022-086-050-114-178-114-022-250-162-238-134-142-182-170-230-030-178-122-202-090-150-138-234-046-142-054-046-074-246-118-066-242-194-194-198-122-130-062-006-062-198-058-006-126-066-250-058-074-198-234-138-062-014-166-062-218-022-086-082-114-210-018-182-186-162-078-070-046-214-074-102-158-210-058-106-058-118-138-106-206-078-150-142-234-054-182-098-242-098-226-038-250-066-222-006-030-102-090-198-062-098-250-154-170-038-042-202-094-014-070-158-186-086-086-050-050-050-050-


Donc, produit une clef de 224 caractères différents à partir de
caractères initiales 2222 (en ascii= 50 50 50 50). Le clair comporte donc
au dessus de 224 caractères ascii zéro.


k=1234
m=0000...
(k1+m1) xor (k3+k4)=
049-050-051-052-086-184-061-193-168-209-068-212-176-085-065-066-051-032-018-112-177-001-160-209-192-144-240-081-129-066-051-036-214-184-189-081-216-145-212-052-208-149-177-114-243-240-082-048-113-081-144-209-016-176-080-209-049-178-179-180-086-184-189-193-040-081-196-212-176-213-065-194-179-160-018-112-049-001-032-081-064-144-240-209-129-194-179-164-214-184-061-081-088-017-084-052-208-021-177-242-115-112-082-048-241-081-016-081-144-176-080-081-049-050-051-052-




Ici, le même calcul produit moins de caractères différents à partir de
la clef 1234 que la clef 2222. Mais plus bas on voit que c'est le contraire
avec un calcul différent.

Voici le résultat à partir d'autres calculs:



k=2222
m=0000...
((k1+k2)xor m1)+k3=
Donne une clef à 224 caractères différents.

k=1234
m=0000...
((k1+k2)xor m1)+k3=
Donne une clef à 896 caractères différents.
------------------------------

k=2222
m=0000...
(k1+m1) xor (k2+k3)=
Donne une clef à 224 caractères différents.

k=1234
m=0000...
(k1+m1) xor (k2+k3)=
Donne une clef à 896 caractères différents.

------------------------------

k=2222
m=0000...
(k1+k2) xor (m1+k3)+k4=
Donne une clef à 160 caractères différents

k=1234
m=0000...
(k1+k2) xor (m1+k3)+k4=
Donne une clef à 640 caractères différents

------------------------------

k=2222
m=0000...
((k1+k2) xor (m1+k3)) xor k4=
Donne une clef à 320 caractères différents

k=1234
m=0000...
((k1+k2) xor (m1+k3)) xor k4=
Donne une clef à 320 caractères différents

------------------------------

k=2222
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 448 caractères différents

k=1234
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 896 caractères différents

------------------------------



Donc, le calcul ici qui produit le plus de caractères différents à
partir soit de la clef (à 4 caractères) 2222 ou 1234 est
(k1+k2) xor (m1+k3)=
C'est justement le calcul qui donne le plus grand nombre de possibilité
parmi les test que j'ai mentionnés au début (plus haut ici) à 4 variables
différentes:
6724352 possibilités: (k1+k2)xor(k3+k4)=164

Prenons ce même calcul et ajoutons des caractères à la clef. Voici
quelques résultats assez convainquant:



k=22222
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 896 caractères différents

k=12345
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 448 caractères différents
------------------------------

k=222222
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 1984 caractères différents

k=123456
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 3968 caractères différents

------------------------------

k=2222222
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 1920 caractères différents

------------------------------

k=1234567 (3975 pas pareil)
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 3840 caractères différents

------------------------------

k=12345678
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 16256 caractères différents

------------------------------

k=123456789
m=0000...
(k1+k2) xor (m1+k3)=
Donne une clef à 16256 caractères différents

------------------------------


Donc, avec une clef de seulement 9 caractères et un clair qui contient
plus de 16256 caractères ascii zéro (0), cela donne une clef de session
comportant 16256 caractères différents.
Dans cet exemple, la clef '123456789' peut donc chiffrer un clair
d'environ 16 Kilo octets, et cela avec une clef de session n'ayant aucun
cycle de caractères qui se répète. En plus le clair comportait uniquement
des caractères ascii zéro (0), c'est à dire, le caractère NUL qui devrait
être le plus facile à utiliser pour déchiffrer.

On pourrait donc supposer que si le clair comportait des caractères
différents du caractère ascii zéro, cela pourrait donner une clef à l'infini
qui n'aurait aucun cycle qui se répète; donc aucun caractère prévisible
puisque influencé par le clair qui n'est pas connu dans son ensemble.
Pour éviter un cycle qui se répète lorsqu'on a un clair de plusieurs Mo
de caractères ascii zéro (ou de plusieurs caractère ayant le même nombre
ascii, tel les pixels d'un bitmap), j'ai pensé ajouté une incrémentation
dans la partie de l'algo (générant le prolongement de la clef) qui sert de
mur de feu, donc le numéro indiquant l'ordre du caractère actuel 'm1' qui
est utilisé pour le prolongement de la clef:
(k1+k2+Rép1) xor (m1+k3)=

Donc, si on est rendu à la lecture du dixième caractère du clair, alors
'Rép1' vaudrait la valeur 10.


Je suis rendu à réfléchir si une autre variable ayant une valeur
imprévisible changeante devrait être ajoutée dans ce mur, disons une valeur
représentée par 'Var?', une valeur prise dans les caractères de la phrase de
passe, dans la clef de session ou dans le clair lui-même :
(k1+k2+Rép1+Var?) xor (m1+k3)=


Qu'en pensez-vous?


Bonne journée.
Raymond H.

10 réponses

2 3 4 5 6
Avatar
Raymond H.
Bonjour,

"Christophe HENRY" a écrit dans le
message de news: cugkv4$1oo7$

-> Par ailleurs, j'ai suffisamment prouvé que la "science" pouvait
venir
-> à
-> bout des versions du simple algo. Lis mes calculs, et on discute
le
-> concept.

En plus, vous appelez cela une preuve.


Elle est peut-être fausse cette démonstration, mais il s'agit d'une
"preuve" au sens mathématique et non au sens du détective...


Disons que j'ai commenté la logique mathématique de chacun de vos
calculs.

Mais je vois que votre conclusion est erronée concernant (votre
théorie) le fait que vos calculs servent à la cryptanalyse du 'Simple
algo'. Aucune preuve n'est donnée pour prouver que le 'Simple algo' de
cette étape-ci est faible.


Je veux bien m'être trompé. De là à dire que "aucune preuve n'est
donnée" :-(


Je parlais concernant la cryptanalyse, du fait de casser l'algo de cette
étape-ci.

Je souhaite que nous nous mettions d'accord sur les choses dont nous
parlons. Sur ta proposition, il n'est nul part fait mention explicite d'un
chiffrement avec une phrase de passe.


Exact. La phrase de passe est sous-entendue depuis plusieurs semaines.
La phrase de passe et le code d'identification ne font pas encore partie
intégrante de l'algo à cette étape-ci, pour éviter des confusions dans la
compréhension vu qu'on est pas encore à cette étape-là. Je voudrais traiter
du sujet de la phrase de passe et du code d'indentification après la
conclusion de cette étape-ci.


Examine la fonction de chiffrement dans son ensemble, détermine si elle
correspond à ta decription. Si ce n'est pas le cas, ne lit pas plus loin
et corrige ma formulation.

c : chiffré


Ok.

m : le clair


Ok. Donc:
Clair1= m = m1
Clair2 = Clair1 incrémenté = m2
Clair3 = Clair2 permuté = m3

k : la clé de chiffrement (la "clé initiale")


k = clef de chiffrement, donc la clef de session complète. Elle inclue
donc aussi la clef de session initiale (ki) et la clef de session finale
(kf).
ki = clef de session initiale.
kf = clef de session finale.

f : la fonction de chiffrement


Ok.

c=f(m,k)


c=f(Clair3,k) car 'm = m1 = Clair1'. Donc, 'c=f(per(inc(m1)),k)' ou
'c=f(m3,k)'
Donc, f chiffre Clair3 en l'xorisant avec k pour donner c.

f(m,k) = xor( per(inc(m)),ses(inc(m),k) )


f(m3,k) = xor(per(inc(m1)), ses(inc(m1),ki))
f(m3,k) = xor(m3, ses(m2,ki))
f(m3,k) = xor(m3, k)
f(m3,k) = c

per : permutation des lettres
inc : incrémentation
ses : calcul de la clé de session

c = xor( per(inc(m)),ses(inc(m),k) )


c = xor( per(inc(m1)),ses(inc(m1),ki) )

ses(inc(m),k) = xor( c, per(inc(m)) )


ses(inc(m1),ki) = xor( c, per(inc(m1)) )

k = ses_1( xor( c, per(inc(m)) ) , ses(inc(m),k) )


Erreur. Même en faisant 'k = ses_1( xor( c, per(inc(m1)) ) ,
ses(inc(m1),ki) )' ça ne fonctionne pas quand même puisque 'k = ses_1(
xor( c, per(inc(m1)) ) , ses(inc(m1),ki) )' équivaut à 'k = ses_1(k, k)'
Car 'k = ses_1(k, k)' n'est pas exact. Pour que ça fonctionne, il
faudrait avoir 'ki = ses_1(k)' qui serait inutile puisque ki fait partie de
k.

S'il y a maldone ici, inutile de continuer la lecture puisque le reste
repose sur ces postulats. Dans ce cas, corrige et reposte.

Donc via '+Var1(x+1)':


Quelle est la syntaxe/sémantique de cette expression ? D'où vient le "x" ?


Disons que je vais simplifier à la manière du langage C: Var1++ (ou
de VB: Var1 = Var1 + 1).



D'accord. J'arrête ici et je reposte pour correction.

a+

r.h.



========================================================
...
Donc, pour défaire la permutation il faut avoir trouvé la dernière
valeur utilisée à la fin du fichier, et cette valeur (avec le code
d'identification et la clef de session finale) est chiffrée (chiffré2)
par la phrase de passe puis associé au chiffré 1.


Sans description précise, je considère uniquement les caractéristiques
concrètes fournies.


Cryptanalyse :


Ce qui suit n'est pas de la cryptanalyse.
"La cryptanalyse est tout simplement l'art de rendre clair un texte
crypté sans avoir connaissance de la clef utilisée.
http://mantis.free.fr/articles/analyse.htm " Or, vos effort sont pour
prouver qu'il est possible de connaître la clef à partir du CLAIR
DÉJÀ CONNU.


C'est rigoureusement exact. La bonne expressions est "attaque avec clair
connu".

...
Je veux dire que casser le 'Simple algo' signifie trouver le clair;
mais ici on aurait déjà le clair, donc le reste ne sert plus à rien
et le 'Simple algo' à cette étape-ci reste fort. Hé oui! Jusqu'à
preuve du contraire :-)


Pas au sens que je martèle depuis longtemps déjà : sur une attaque à
clair connu. Ma position n'a jamais changé.


Alors, pourquoi tenter de trouver la clef initiale à partir de ce
clair? Cette clef n'est plus utilisable et est jetable. Il serait
préférable de la laisser à la poubelle ;-) Je vous taquine :-)


Les spécifications de l'algorithme telles que je les donne au début de
ce post et, normalement, sont telles que tu me les a décrits. J'ignore
les éventualités futures ou fonctions non-implémentées.

Le point d'attaque reste obligatoirement cette clé, qu'un utilisateur
pourrait rejouer. Maintenant, s'il s'avérait que tu avais
malencontreusement oublié de préciser _concrètement_ le tarabiscotage
de cette clé, complète.

Je reste sur les attaques à clair connu. La doctrine affirme qu'un
cryptosystème ne passant pas cette phase ne vaut pas le coup. Alors,
je suis bêtement la doctrine...


Mais, cette doctrine n'est pas applicable à l'algo de Vernam, le seul
algo indéchiffrable, donc le seul algo qui vaudrait le coup à 100% :-)


En fait, dans ladite doctrine, il est supposé que le mot de passe peut
être rejoué par l'utilisateur. Un algo possédant cette faiblesse se
voit interdit d'utiliser deux fois de suite la même clé.


Le 'Simple algo' est inspiré de celui de Varnam et est un crypto
système à clef jetable, donc inutile de ramasser les clefs à la
poubelle ;-)


Soit tu obliges tes utilisateurs à changer de clé à chaque utilisation
et ton produit n'est pas utilisable dans la pratique, soit il y a un truc
supplémentaire qui te fait voir cette clé comme une clé de session mais
il n'y en a pas d'indication concrète dans tes étapes de calcul.


Pas d'accord. Vu l'empilement de calculs, ça commence à faire un peu
long pour moi. Le principe d'une attaque à clair connu est que,
justement, on a tout le clair. Pas une partie.


Si vous voulez dire qu'il vous faut tout le clair avant de tenter
une attaque à clair connu, alors ce principe ne s'applique pas au
'Simple algo' de cette étape-ci, et pas plus à l'algo de Vernam.
Puisque ce sont deux systèmes à 'clef jetable' (One time pad). Du
même coup ce principe ne s'appliquera pas à AllCrypter si celui-ci,
dans sa version 3, tire son inspiration de cette étape-ci.


A moins d'obliger tes utilisateurs à changer de clé, il faudra bien
qu'il y ait une clé - information connue des correspondants seuls - qui
ne change pas. Ici, je n'ai que la clé "initiale".


Mais, j'avais pensé que vous demanderiez un chiffré et une partie
de son clair (les premier caractères du clair) qui correspond à la
même longueur que la clef de session initiale. Cela aurait été
équitable pour tenter de trouver le clair au complet afin de prouver si
oui ou non c'est possible.


Mes calculs précédents ne nécessitaient qu'une longueur de clair
équivalente à la longueur de la clé. Dans cette nouvelle version, soit
je refais mes calculs au détail, soit je choisis le clair en entier
pour faire plus simple histoire de gagner du temps.


Ton exposé était très long. J'ai du mal à te suivre, alors j'avoue en
avoir zappé une partie. Je préfère une formulation bien théorique
qu'une suite longue d'explication en langue française qui est peu
adaptée aux calculs formels.

Cordialement,

--
Christophe HENRY
(sans lkm)
GnuPG : 3922239E60036EC86BF7268A877C52AC 4883C02A




Avatar
Christophe HENRY

Je souhaite que nous nous mettions d'accord sur les choses dont nous
parlons. Sur ta proposition, il n'est nul part fait mention explicite d'un
chiffrement avec une phrase de passe.


Exact. La phrase de passe est sous-entendue depuis plusieurs semaines.
La phrase de passe et le code d'identification ne font pas encore partie
intégrante de l'algo à cette étape-ci, pour éviter des confusions dans la
compréhension vu qu'on est pas encore à cette étape-là. Je voudrais traiter
du sujet de la phrase de passe et du code d'indentification après la
conclusion de cette étape-ci.


Non. Ou alors, je vais sous-entendre que cette phrase de passe est
devinable et que j'aurais accès aux données qu'ils protègent. Mais tu
répondras peut-être que ce chiffrement de clé de session par cette
phrase de passe est inviolable.

Du concret ! Considère que je ne suis pas beaucoup plus intelligent que
la machine que j'utilise. Je ne sais traiter que les choses tangibles.


k : la clé de chiffrement (la "clé initiale")


k = clef de chiffrement, donc la clef de session complète. Elle inclue
donc aussi la clef de session initiale (ki) et la clef de session finale
(kf).
ki = clef de session initiale.
kf = clef de session finale.


Etant donné que tu réserves 'k' (la clé fournie par l'utilisateur) pour
la phrase de passe de l'utilisateur et que le 'k' que j'ai défini n'est
qu'une clé de _s_ession, je te propose de renommer tout cela en 's', 'si'
et 'sf'.


c=f(m,k)


c=f(Clair3,k) car 'm = m1 = Clair1'. Donc, 'c=f(per(inc(m1)),k)' ou
'c=f(m3,k)'
Donc, f chiffre Clair3 en l'xorisant avec k pour donner c.


Pas du tout. 'f' est une fonction qui - pour le moment - prends en
paramètres les données externes du chiffrement : le clair et la clé. En
reformulant, cela donne :

c = f(m , k) = xor( per(inc( m)) , ses(inc( m), k) )

c = f(m1,ki) = xor( per(inc(m1)) , ses(inc(m1),ki) )

Ceci dit, je n'aime pas vraiment compliquer l'écriture du clair qui est
traditionnelement désigné par 'm'. 'Clair1', 'Clair2', 'm1', 'm2', etc.
Ne sont plus des clairs puisque ce sont des sous-calculs du chiffrement.
Pourquoi pas 'r1', 'r2', etc. en tant que _r_ésultats ?


f(m,k) = xor( per(inc(m)),ses(inc(m),k) )


f(m3,k) = xor(per(inc(m1)), ses(inc(m1),ki))


Ca ne va pas, là. La fonctionn est sensée donner un résultat qui est
fonction des paramètres 'm3' et 'k'. Or non-seulement on ne retrouve pas
'm3' mais il y a en plus un 'm1' qui n'est pas défini.

k = ses_1( xor( c, per(inc(m)) ) , ses(inc(m),k) )


Erreur.


Effectivement. Ecrit un peu vite :-/

ki = ses_1( xor(c,per(inc(m))) )

En rappelant qu'obtenir la clé initiale à partir de la clé de session
est simple puisqu'il suffit de ne garder que les premiers octets. La
fonction 'ses_1()' (réciproque de 'ses()') n'utilise donc qu'un seul
paramètre.

Si tu es d'accord avec cette dernière équation, tu comprendra

Quelle est la syntaxe/sémantique de cette expression ? D'où vient le "x" ?


Disons que je vais simplifier à la manière du langage C: Var1++ (ou
de VB: Var1 = Var1 + 1).


Pour ma part, je n'ai pas encore tenu compte de l'intérieur de inc(). Je
retiens jusqu'il s'agit d'un brouillage consistant en une substitution
dont la clé est codée dans le procédé. Mes démonstrations sont
valables quelque soit la manière dont tu brouilles le clair.


D'accord. J'arrête ici et je reposte pour correction.
Donc, pour défaire la permutation il faut avoir trouvé la dernière
valeur utilisée à la fin du fichier, et cette valeur (avec le code
d'identification et la clef de session finale) est chiffrée (chiffré2)
par la phrase de passe puis associé au chiffré 1.
...




Coupe le texte que tu n'utilises pas.
Règle ton horloge ! Tu réponds vers 19:04 à un message que j'ai posté
à 22:50.


Si je prends un peu d'avance, je vais désigner par 's' la clé de session
(actuellement 'k') et par 'k' la phrase de passe. 'm' est toujours le
clair, et le chiffré.

c = f(m,k) = xor( per(inc( m)) , s ) || p(s,k)
avec s = ses(inc(m),k)

Le chiffré est le résultat de la fonction f() utilisant le clair 'm' et
la phrase de passe (la _k_lé). Le résultat est la délivrance de deux
données (unies avec || ), la première étant familière et la deuxième
consistant en le chiffrement de la clé de session 's' au moyen d'un
algorithme désigné par la fonction p() prenant également la phrase de
passe 'k' de l'utilisateur.


--
Christophe HENRY
(sans lkm)
GnuPG : 3922239E60036EC86BF7268A877C52AC 4883C02A



Avatar
Raymond H.
Bonjour,

"Christophe HENRY" a écrit dans le
message de news: cugkv4$1oo7$
...

...
Donc, pour défaire la permutation il faut avoir trouvé la dernière
valeur utilisée à la fin du fichier, et cette valeur (avec le code
d'identification et la clef de session finale) est chiffrée (chiffré2)
par la phrase de passe puis associé au chiffré 1.


Sans description précise, je considère uniquement les caractéristiques
concrètes fournies.


Je voudrais préciser qu'avant de trouver la dernière valeur qui a servis
à permuter le dernier groupe de 8 caractères, il faut avoir déchiffré cette
dernière valeur. Or, cette dernière valeur qui fait partie du dernier
groupe est chiffré avec les autres octets des groupes précédents. En plus,
ce dernier groupe est inclut avec la clef de session finale et le code
d'identification de la phrase de passe. Mais, à cette étape-ci le dernier
groupe n'est pas chiffré une 2e fois, c'est à dire avec la clef de session
finale et le code d'identification de la phrase de passe qui eux
n'apparaissent pas à cette étape-ci avec les données. C'est sur cette
finale que l'attaque pour trouver la phrase de passe (ou clef personnelle
qui peut être utilisée plusieurs fois par l'utilisateur) doit être faite.


Le point d'attaque reste obligatoirement cette clé, qu'un utilisateur
pourrait rejouer.

Maintenant, s'il s'avérait que tu avais
malencontreusement oublié de préciser _concrètement_ le tarabiscotage
de cette clé, complète.



Oui, et la clef qu'un utilisateur pourrait rejouer, ou réutiliser est la
phrase de passe qui est sa clef personnelle et non la clef de session
(initiale) que l'algo génère à chaque chiffrage. Mais cette phrase de passe
ferait l'objet d'une étape future (après cette étape-ci).

Le but de la phrase de passe est de générer un code d'identification qui
servirait à identifier si c'est la bonne phrase de passe que l'utilisateur a
tapé au début d'une chiffrement, et si cette phrase de passe correspond bien
au code identification alors le processus de déchiffrement est accepté. La
2e raison de la phrase de passe est que cette phrase de passe chiffre (2e
chiffré joint au chiffré1) le code d'identification, la clef de session
finale et le dernier groupe (de 8 octets ou moins) qui n'a pas été permuté
puisqu'il n'existait pas de 9e octets pour indiquer un choix de permutation
parmi les 10 choix de permutation. Donc, ce dernier groupe d'octets est
chiffré deux fois; ainsi, il fait partie du chiffré1 et du chiffré2; donc,
cette partie du chiffré1 fait partie du chiffré2.



Je reste sur les attaques à clair connu. La doctrine affirme qu'un
cryptosystème ne passant pas cette phase ne vaut pas le coup. Alors,
je suis bêtement la doctrine...


Mais, cette doctrine n'est pas applicable à l'algo de Vernam, le seul
algo indéchiffrable, donc le seul algo qui vaudrait le coup à 100% :-)


En fait, dans ladite doctrine, il est supposé que le mot de passe peut
être rejoué par l'utilisateur.


Dans ce cas, il serait question de la phrase de passe, c'est-à-dire, de
la clef personnelle de l'utilisateur qu'il peut réutiliser pour chiffrer
(chiffré2) le code d'identification, la clef de session finale et le dernier
groupe de caractères (les 8 octets ou moins qui n'ont pas été permutés).
Mais la phrase de passe ne fait pas l'objet de cette étape-ci.

Soit tu obliges tes utilisateurs à changer de clé à chaque utilisation
et ton produit n'est pas utilisable dans la pratique, soit il y a un truc
supplémentaire qui te fait voir cette clé comme une clé de session mais
il n'y en a pas d'indication concrète dans tes étapes de calcul.


Expliqué juste ci-dessus.

A moins d'obliger tes utilisateurs à changer de clé, il faudra bien
qu'il y ait une clé - information connue des correspondants seuls - qui
ne change pas. Ici, je n'ai que la clé "initiale".


Expliqué ci-dessus. La clef initiale et la phrase de passe (ou clef
personnelle) sont distinctes: la première est générée par l'algo à chaque
chiffrage, et la deuxième est écrite par l'utilisateur qui peut l'utiliser
plusieurs fois comme bon lui semble.

Mais, j'avais pensé que vous demanderiez un chiffré et une partie
de son clair (les premier caractères du clair) qui correspond à la
même longueur que la clef de session initiale. Cela aurait été
équitable pour tenter de trouver le clair au complet afin de prouver si
oui ou non c'est possible.


Mes calculs précédents ne nécessitaient qu'une longueur de clair
équivalente à la longueur de la clé.


Je pense qu'à cette étape-ci, serait de trouver la clef initiale à
partir des premiers octets connus du clair. Il faudrait supposer qu'on
connaît au moins le même nombre de caractères que la clef de session
initiale, et cela afin de restituer la clef de session initiale. Je pense
que c'est ici le point critique. Si quelqu'un connaît par exemple les 10
premiers caractères du clair et que la clef de session initiale a un nombre
de caractères inférieur à 10 caractères, alors l'attaque serait d'essayer de
reconstituer cette clef de session à partir de cette portion connue du
clair. C'est pour cela que je fais une incrémentation du clair (pour donner
Clair2) et une permutation du Clair2 (pour donner Clair3); c'est pour cela
que je crée la clef de session complète à partir de Clair2 et non à partir
de Clair3 qui lui, est xorisé avec la clef de session complète pour donner
le chiffré. Je crée donc une confusion en créant des inconnus.

Le tout se joue là. Reste à voir si ce genre d'attaque tient le coup.
Pour réussir à empêcher ce genre d'attaque, il faut que les calculs
effectués pour trouver la clef de session initiale soient aussi difficile
que faire une attaque à force brute (soit essayer toutes les combinaisons
possibles de phrases de passe, soit essayer toutes les clefs de session
initiales possible à l'aide de la partie connue du clair).

Et encore là, même si la clef de session initiale serait trouvée,
comment faire pour construire la clef de session complète? Puisque pour la
construire on doit connaître tout le clair dans son intégralité, et ce clair
est incrémenté, permuté et chiffré. C'est le seul point à mon avis qui doit
trouver une réponse, sinon je pense qu'à cette étape-ci il n'y a plus rien à
faire. Et s'il n'y a plus rien à faire, alors, d'une certaine façon, ce
'Simple algo' dépasserait celui de Vernam pour la raison, qu'à cette
étape-ci, on n'aurait que la clef de session finale à retenir; les deux
seraient unique, mais la clef de session finale serait plus courte que la
clef du chiffré de Vernam (surtout pour un fichier de plusieurs Méga
octets). Mais, mon but n'est pas de retenir la clef de session finale mais,
comme expliquée plus haut, de retenir la clef personnelle (c'est-à-dire, la
phrase de passe qui peut être utilisée plusieurs fois).


Bonne journée.

Raymond Houle



Avatar
Christophe HENRY

Sans description précise, je considère uniquement les caractéristiques
concrètes fournies.


Oui, et la clef qu'un utilisateur pourrait rejouer, ou réutiliser est la
phrase de passe qui est sa clef personnelle et non la clef de session
(initiale) que l'algo génère à chaque chiffrage. Mais cette phrase de passe
ferait l'objet d'une étape future (après cette étape-ci).


Non.
Pour le moment, la clé est ce que tu appeles "clé de session". Si
cette clé de session change (on va supposer vraiment aléatoirement)
alors ton procédé a peut-être (on va supposer que c'est vrai) la
robustesse du Vigenère, faiblesses y comprises.


Le but de la phrase de passe est de générer un code d'identification qui
servirait à identifier si c'est la bonne phrase de passe que l'utilisateur a
tapé au début d'une chiffrement, et si cette phrase de passe correspond bien
au code identification alors le processus de déchiffrement est accepté.


C'est du _logiciel_. L'aspect logiciel est complétement hors-sujet
là-dedans. Il s'agit d'un confort d'interface, graphique en l'occurence.
Cela n'ajoute strictement rien à la robustesse de ton procédé. Afin de
clarifier l'étude, retire (s'il te plait) cet aspect de ton exposé.

...
Mais la phrase de passe ne fait pas l'objet de cette étape-ci.


C'est bien dommage car je ne livrerai pas mes résultats tant que je
n'aurai pas à disposition le cryptosystème complet comprenant, entre
autres, le cheminement du clair vers le chiffré en passant par la clé.
Le clair : les données à chiffrer.
Le chiffré : TOUT ce que l'utilisateur obtient.
La clé : ce que l'utilisateur connaît de lui-seul.


Mes calculs précédents ne nécessitaient qu'une longueur de clair
équivalente à la longueur de la clé.


Je pense qu'à cette étape-ci, serait de trouver la clef initiale
à partir des premiers octets connus du clair.


En fait, lors de mes calculs précédents il était pertinent de faire
cela car la clé était réutilisée par l'utilisateur. Ici, cela ne sert
à rien puisque la clé de session (on va supposer) est aléatoire. Il
faut donc découvrir cette fameuse clé.


...
C'est pour cela que je fais une incrémentation du clair (pour donner
Clair2) et une permutation du Clair2 (pour donner Clair3); c'est pour
cela que je crée la clef de session complète à partir de Clair2 et
non à partir de Clair3 qui lui, est xorisé avec la clef de session
complète pour donner le chiffré. Je crée donc une confusion en
créant des inconnus.


Je ne trouve pas, au contraire. Mais je garde mes arguments pour le moment
où j'aurai toutes les billes.


...
sinon je pense qu'à cette étape-ci il n'y a plus rien à faire.


Je confirme. En fait, il te suffit de chiffer la clé de session avec
l'algorithme CAST5 de gnupg et je serai très gêné ! La clé de
ton utilisateur serait alors la clé passée à gnupg pour chiffrer ta clé
de session...


Maintenant, tu peux peut-être te demander pourquoi j'attends que tu
complètes le cryptosystème au lieu de déchiqueter l'existant ?
- c'est devenu compliqué (mais pas plus sûr) donc long à tester.
- ton procédé a déjà des fautes de principes, à voir plus tard :-]
- j'attends que tu introduises la faiblesse supplémentaire qui va faire
s'écrouler l'existant.

Ton dilemne est le suivant :
1/ Soit tu imposes à tes utilisateurs une clé
aussi longue que le clair et à changer tout le temps. Ca marche, mais
autant faire du Vigenère.
2/ Soit tu imposes à tes utilisateurs une clé bien moins longue et
facile à retenir qu'ils pourront réutiliser.

J'attends patiemment que tu pourrisses ton système en l'achevant, dans
les deux sens courants de ce terme :-p

Livre les spécifications complètes. Après, je te dis tout.

--
Christophe HENRY
(sans lkm)
GnuPG : 3922239E60036EC86BF7268A877C52AC 4883C02A


Avatar
Raymond H.
Bonjour,

"Christophe HENRY" a écrit dans le
message de news: cuhlrf$231m$

Je souhaite que nous nous mettions d'accord sur les choses dont nous
parlons. Sur ta proposition, il n'est nul part fait mention explicite
d'un
chiffrement avec une phrase de passe.


Exact. La phrase de passe est sous-entendue depuis plusieurs
semaines.
La phrase de passe et le code d'identification ne font pas encore partie
intégrante de l'algo à cette étape-ci, pour éviter des confusions dans la
compréhension vu qu'on est pas encore à cette étape-là. Je voudrais
traiter
du sujet de la phrase de passe et du code d'indentification après la
conclusion de cette étape-ci.


Non. Ou alors, je vais sous-entendre que cette phrase de passe est
devinable et que j'aurais accès aux données qu'ils protègent. Mais tu
répondras peut-être que ce chiffrement de clé de session par cette
phrase de passe est inviolable.



Non. Je ne dis pas qu'elle est inviolable puisqu'on n'est pas rendu à
cette étape-là.


Du concret ! Considère que je ne suis pas beaucoup plus intelligent que
la machine que j'utilise. Je ne sais traiter que les choses tangibles.



J'aimerais mieux qu'on ne traite pas de la phrase de passe maintenant,
ni du code d'identification de la phrase de passe. Car avant de sauter à
cette étape-là il faudrait conclure cette étape-ci afin que cette étape-ci
du simple algo soit sûre.


k : la clé de chiffrement (la "clé initiale")


k = clef de chiffrement, donc la clef de session complète. Elle
inclue
donc aussi la clef de session initiale (ki) et la clef de session finale
(kf).
ki = clef de session initiale.
kf = clef de session finale.


Etant donné que tu réserves 'k' (la clé fournie par l'utilisateur) pour
la phrase de passe de l'utilisateur et que le 'k' que j'ai défini n'est
qu'une clé de _s_ession, je te propose de renommer tout cela en 's', 'si'
et 'sf'.


Bonne idée. Donc:
s = clef de session complète (intégrant la partie initiale et la partie
finale de la clef).
si = clef de session initiale.
sf = clef de session finale.

c=f(m,k)


c=f(Clair3,k) car 'm = m1 = Clair1'. Donc, 'c=f(per(inc(m1)),k)' ou
'c=f(m3,k)'
Donc, f chiffre Clair3 en l'xorisant avec k pour donner c.


Pas du tout. 'f' est une fonction qui - pour le moment - prends en
paramètres les données externes du chiffrement : le clair et la clé. En
reformulant, cela donne :

c = f(m , k) = xor( per(inc( m)) , ses(inc( m), k) )

c = f(m1,ki) = xor( per(inc(m1)) , ses(inc(m1),ki) )


D'accord à la manière d'une fonction de la programmation. Mais vue les
récentes modifications d'interprétations je débuterais toutes les fonctions
par f et ajoutant la terminaison pour identifier la fonction en tant que
telle.

Donc: 'f1' pour la fonction du chiffrage fait à partir de la clef de
session (maintenant nommé 's') et du clair 'm' ou 'm1'.

La fonction chiffrant la clef de session finale et le code
d'identification serait indiquée par 'f2'. Donc, 'c = f1(m,si) ||
f2(sf,ci)'. 'ci' pour le code d'identification. Faudrait confirmer pour le
'ci' puisque c'est 'ci' qui est chiffré et non 'k' (la phrase de passe).
Par contre, c'est à partir de la phrase de passe que ce chiffrement à lieu.


Ceci dit, je n'aime pas vraiment compliquer l'écriture du clair qui est
traditionnelement désigné par 'm'. 'Clair1', 'Clair2', 'm1', 'm2', etc.
Ne sont plus des clairs puisque ce sont des sous-calculs du chiffrement.
Pourquoi pas 'r1', 'r2', etc. en tant que _r_ésultats ?



Quelque chose de plus significatif? Peut-être:
m = clair
mr1 = clair incrémenté
mr2 = clair incrémenté et permuté

f(m,k) = xor( per(inc(m)),ses(inc(m),k) )


f(m3,k) = xor(per(inc(m1)), ses(inc(m1),ki))


Ca ne va pas, là. La fonctionn est sensée donner un résultat qui est
fonction des paramètres 'm3' et 'k'. Or non-seulement on ne retrouve pas
'm3' mais il y a en plus un 'm1' qui n'est pas défini.


Bien qu'en programmation il ne soit pas obligatoire de fournir une
donnée source aux fonctions mais qu'on peut fournir une donnée intermédiaire
(modifiée), si vous le désirez on peut toutefois toujours donner une valeur
source à f(). Donc, m au lieu de m2 ou m3 et k au lieu de ki ou kf. Ainsi,
on saurait à partir de quelles valeurs d'origine la fonction est traitée;
donc globalement.


k = ses_1( xor( c, per(inc(m)) ) , ses(inc(m),k) )


Erreur.


Effectivement. Ecrit un peu vite :-/

ki = ses_1( xor(c,per(inc(m))) )

En rappelant qu'obtenir la clé initiale à partir de la clé de session
est simple puisqu'il suffit de ne garder que les premiers octets. La
fonction 'ses_1()' (réciproque de 'ses()') n'utilise donc qu'un seul
paramètre.

Si tu es d'accord avec cette dernière équation, tu comprendra


Quelque chose ne semble pas aller dans 'ki = ses_1(
xor(c,per(inc(m))) )', car 'ki = ses_1(k)' ne dit pas à partir de quoi k est
réduit pour trouver ki, puisqu'il faut la bonne taille de ki sinon ki n'est
pas trouvé. Donc, si pour trouver k (clef de session complète) il faut
faire 'k = ses(mr1,ki)' [mr1= résultat de m incrémenté], alors pour trouver
ki il faudrait faire l'inverse à partir de la clef de session finale, donc
'ki = ses_1(mr1,kf)'.

Règle ton horloge ! Tu réponds vers 19:04 à un message que j'ai posté
à 22:50.


À l'envoie de l'un de mes dernier message, mon fournisseur ne l'affiche
pas. J'ai donc dû le voir via http.
L'heure 22:50 que vous mentionnez affiche 16:50 dans mon logiciel.
Donc, un décalage de 6 heures. Si vous demeurez en France alors il y a un
décalage de 6 heures entre ici (la Canada) et la France. Vous avez 6 heures
de plus qu'ici. Donc, 22:50h moins 6 heures = 16:50h. Ce qui voudrait dire
que j'ai posté mon message 2 heures 14 minutes après le vôtre. C'est
peut-être le fournisseur qui a fait l'erreur de translation.

Si je prends un peu d'avance, je vais désigner par 's' la clé de session
(actuellement 'k') et par 'k' la phrase de passe. 'm' est toujours le
clair, et le chiffré.

c = f(m,k) = xor( per(inc( m)) , s ) || p(s,k)
avec s = ses(inc(m),k)

Le chiffré est le résultat de la fonction f() utilisant le clair 'm' et
la phrase de passe (la _k_lé). Le résultat est la délivrance de deux
données (unies avec || ), la première étant familière et la deuxième
consistant en le chiffrement de la clé de session 's' au moyen d'un
algorithme désigné par la fonction p() prenant également la phrase de
passe 'k' de l'utilisateur.


Disons qu'on remplace p() par f2(). Mais en réalité ce serait un peu
plus compliqué puisque j'intégrerais aussi le dernier groupe d'octets (qui
n'a pas son 9e caractère qui indique le choix de permutation), la clef de
session finale et le code d'identification de la phrase de passe. Ça
donnerait 'f2(g || sf || ci, k)'; g = dernier groupe d'octets du chiffré1.
Donc, 'c = f1(m,k) = xor( per(inc( m)) , s ) || f2(g || sf || ci , k)'.

Donc:

c1 = f1(m,k)

c2 = f2(g || sf || ci, k)

c = c1 || c2



Bonne journée :-)

Raymond H.



Avatar
Johann Dantant
"Raymond H." a écrit dans le message de
news:Tt0Pd.5350$

<citation>Bien qu'en programmation il ne soit pas obligatoire de fournir une
donnée source aux fonctions [...]</citation>

J'adooooooooooooooore l'abstrait !

--
J.D.
Avatar
Christophe HENRY

J'aimerais mieux qu'on ne traite pas de la phrase de passe maintenant,
ni du code d'identification de la phrase de passe.
...
Car avant de sauter à
cette étape-là il faudrait conclure cette étape-ci afin que cette étape-ci
du simple algo soit sûre.


Elle est (on va dire) aussi sûre qu'un vigenère sur lequel on n'utilise
pas le même mot de passe deux fois. La question est donc réglée.


D'accord à la manière d'une fonction de la programmation. Mais vue les
récentes modifications d'interprétations je débuterais toutes les fonctions
par f et ajoutant la terminaison pour identifier la fonction en tant que
telle.

Donc: 'f1' pour la fonction du chiffrage fait à partir de la clef de
session (maintenant nommé 's') et du clair 'm' ou 'm1'.


C'était trop simple d'utiliser des noms de fonctions qui rappellent le
traitement fait au code ?!


La fonction chiffrant la clef de session finale et le code
d'identification serait indiquée par 'f2'. Donc, 'c = f1(m,si) ||
f2(sf,ci)'. 'ci' pour le code d'identification.


Laisse tomber ce "code d'identification", il n'apporte aucune robustesse
supplémentaire au procédé. Ca complique inutilement l'ensemble.


Ca ne va pas, là. La fonctionn est sensée donner un résultat qui est
fonction des paramètres 'm3' et 'k'. Or non-seulement on ne retrouve pas
'm3' mais il y a en plus un 'm1' qui n'est pas défini.


Bien qu'en programmation il ne soit pas obligatoire de fournir une
donnée source aux fonctions mais qu'on peut fournir une donnée intermédiaire
(modifiée), si vous le désirez on peut toutefois toujours donner une valeur
source à f(). Donc, m au lieu de m2 ou m3 et k au lieu de ki ou kf. Ainsi,
on saurait à partir de quelles valeurs d'origine la fonction est traitée;
donc globalement.


Ce n'est pas de la programmation ici. Ce sont des mathématiques. Elles
ont la particularité d'empêcher tout brouillage des pistes.
Des données subissent des traitements à travers une fonction. En
entrée, on a _toutes_ les composantes impliquées et en sortie on a un
résultat.


Quelque chose ne semble pas aller dans 'ki = ses_1(
xor(c,per(inc(m))) )', car 'ki = ses_1(k)' ne dit pas à partir de quoi
k est réduit pour trouver ki, puisqu'il faut la bonne taille de ki


Il suffira - si rien n'a été trouvé entre-temps - d'essayer toutes les
tailles de k. Ce n'est pas un obstacle puisque le temps de calcul
supplémentaire sera négligeable. Ce n'est pas de la force brute puisque
l'allongement de cette clé de session ne gêrera pas vu le faible nombre
d'essais.


sinon ki n'est pas trouvé. Donc, si pour trouver k (clef de session
complète) il faut faire 'k = ses(mr1,ki)' [mr1= résultat de m
incrémenté], alors pour trouver ki il faudrait faire l'inverse à
partir de la clef de session finale, donc 'ki = ses_1(mr1,kf)'.


En fait, une faiblesse devrait être ajoutée lorsque tu auras complété
ton procédé. Cela me permettra de trouver la bonne taille. Mais
j'attends toujours...


Règle ton horloge ! Tu réponds vers 19:04 à un message que j'ai
posté à 22:50.


L'heure 22:50 que vous mentionnez affiche 16:50 dans mon logiciel.
Donc, un décalage de 6 heures. Si vous demeurez en France alors il y a
...


Je n'avais pas pensé à cela. J'ai tendance à confondre le "fr" avec
France :-o


Disons qu'on remplace p() par f2(). Mais en réalité ce serait un
peu plus compliqué puisque j'intégrerais aussi le dernier groupe
d'octets
...


Au conditionnel de ton exposé correspond le futur de mes réponses.

--
Christophe HENRY
(sans lkm)
GnuPG : 3922239E60036EC86BF7268A877C52AC 4883C02A


Avatar
Raymond H.
Bonjour,

"Christophe HENRY" a écrit dans le
message de news: cui07j$28p1$

Sans description précise, je considère uniquement les caractéristiques
concrètes fournies.


Oui, et la clef qu'un utilisateur pourrait rejouer, ou réutiliser est
la
phrase de passe qui est sa clef personnelle et non la clef de session
(initiale) que l'algo génère à chaque chiffrage. Mais cette phrase de
passe
ferait l'objet d'une étape future (après cette étape-ci).


Non.
Pour le moment, la clé est ce que tu appeles "clé de session".


Pourtant on a décidé de nommer 'k' la phrase de passe. On a donc
accepté que la phrase de passe soit une clef, et je la nomme 'clef
personnelle'. Mais on pourrait aussi bien la nommée 'clef de passe',
puisque ce n'est pas nécessairement un mot (mot de passe) ou une phrase
(phrase de passe que l'utilisateur va choisir); car ça peut être des
caractères n'ayant aucun lien avec un mot ou une phrase. C'est pourquoi je
préfère 'clef personnelle' ou 'clef de passe' ou 'clef d'accès'. C'est
vraiment une clef puisqu'elle sert aussi à CHIFFRER la clef de session...

Si
cette clé de session change (on va supposer vraiment aléatoirement)
alors ton procédé a peut-être (on va supposer que c'est vrai) la
robustesse du Vigenère, faiblesses y comprises.


La clef de session demeure. Le principe ne change pas. Car la clef
personnelle est indépendante de la clef de session initiale, complète ou
finale.

Le but de la phrase de passe est de générer un code d'identification
qui
servirait à identifier si c'est la bonne phrase de passe que
l'utilisateur a
tapé au début d'une chiffrement, et si cette phrase de passe correspond
bien
au code identification alors le processus de déchiffrement est accepté.


C'est du _logiciel_. L'aspect logiciel est complétement hors-sujet
là-dedans. Il s'agit d'un confort d'interface, graphique en l'occurence.
Cela n'ajoute strictement rien à la robustesse de ton procédé. Afin de
clarifier l'étude, retire (s'il te plait) cet aspect de ton exposé.



Désolé! Je ne peux pas, car c'est nécessaire même. Ce n'est pas une
question d'interface.

Je m'explique. Pour déchiffrer, si l'algo ne reconnaît pas lorsque
l'utilisateur se trompe en tapant la mauvaise clef personnelle (phrase de
passe) alors l'algo va chiffrer le chiffré d'une autre façon, au lieu de le
déchiffrer; et l'utilisateur pourrait être dans la confusion en ayant un
chiffré qui est chiffré deux fois. Ainsi sa 'clef personnelle' ne
fonctionnerait plus pour le déchiffrement, et s'il ne se souvient plus de
son erreur de frappe alors son fichier est perdu puisque indéchiffrable.
C'est à cela que le code d'identification de la clef personnelle (phrase
de passe) sert. La 'clef personnelle' crée une suite de caractères appelés
'code d'identification' car ce code sert à identifier si c'est la bonne clef
personnelle que l'utilisateur écrit. Ainsi, il faut que les deux
correspondent pour poursuivre de déchiffrage sinon ça arrête là, et un
message s'afficherait à l'écran pour dire que la phrase de passe (clef
personnelle) n'est pas la bonne. Cette étape est donc obligatoire et fait
ainsi partie de l'algo puisque c'est après avoir déchiffrer le chiffré2 que
l'identification est possible (par comparaison de la clef personnelle et du
code d'identification. Autrement dit, la clef personnelle crée le code
d'identification et ensuite la clef personnelle déchiffre le chiffré2 (qui
contient le code d'identification et la clef de session finale) puis les
deux code d'identification sont comparés et si les deux sont identiques
alors le processus du déchiffrage continue autrement il s'arrête là donnant
un message disant que la clef personnelle est fausse.


...
Mais la phrase de passe ne fait pas l'objet de cette étape-ci.


C'est bien dommage car je ne livrerai pas mes résultats tant que je
n'aurai pas à disposition le cryptosystème complet comprenant, entre
autres, le cheminement du clair vers le chiffré en passant par la clé.
Le clair : les données à chiffrer.
Le chiffré : TOUT ce que l'utilisateur obtient.
La clé : ce que l'utilisateur connaît de lui-seul.



Ce que l'utilisateur connaît de lui seul est donc la 'clef personnelle'
(phrase de passe). Je pense à ça tout d'un coup: 'personnelle' signifie
'privé', et justement ce terme existe: 'clef privée'. J'utiliserais donc ce
terme pour désigner la phrase de passe au lieu de 'clef personnelle'. Qu'en
dites-vous?
Donc, puisque vous concluez cette étape-ci, alors je vais débuter un
autre message traitant du chiffré2 et du même coup du chiffré dans son
ensemble: 'c'.



Mes calculs précédents ne nécessitaient qu'une longueur de clair
équivalente à la longueur de la clé.


Je pense qu'à cette étape-ci, serait de trouver la clef initiale
à partir des premiers octets connus du clair.


En fait, lors de mes calculs précédents il était pertinent de faire
cela car la clé était réutilisée par l'utilisateur. Ici, cela ne sert
à rien puisque la clé de session (on va supposer) est aléatoire. Il
faut donc découvrir cette fameuse clé.


Selon que je comprends, vous voulez parler de trouver cette fameuse clef
de session complète par une attaque du chiffré2 qui dévoilerais la clef de
session finale, et ainsi procéder au déchiffrement total en inversant
l'algo.

sinon je pense qu'à cette étape-ci il n'y a plus rien à faire.


Je confirme. En fait, il te suffit de chiffer la clé de session avec
l'algorithme CAST5 de gnupg et je serai très gêné ! La clé de
ton utilisateur serait alors la clé passée à gnupg pour chiffrer ta clé
de session...


Vous voulez dire que ce serait une bonne chose d'utiliser GAST5 pour le
chiffré2 ? Cela demande plein de question.

-Est-ce un algo très sûr?

- Existe-t-il une dll pour être utilisé en VB?

- Aie-je le droit de l'utiliser dans mon logiciel commercial?

- Est-il compliqué à utiliser?

- Quelle est la taille de la DLL ou du code source?

- Crypte-t-il un maximum d'octets à la fois?



Voici ce que j'ai lu sur http://sunsite.icm.edu.pl/gnupg/fr/gnupg.html :

"GnuPG se compile et fonctionne sur beaucoup de systèmes, mais à cause du
manque d'une bonne source d'entropie testée, il doit être utilisé avec
précaution."



Cette phrase ne donne pas une grande confiance dans GnuPG. J'imagine
que ce sont des codes sources qui se compile en C.



À http://www.gnupg.org/(fr)/features.html il est dit: "Ne doit pas utiliser
un quelconque algorithme breveté.". Quelqu'un qui a un copyright sur son
algo, pourrait-il utiliser GnuPG?

J'ai lu ceci: "Sources de GnuPG 1.4.0 compressées avec bzip2. 2658k".
Je trouve que 3 Mo pour chiffrer la finale du simple algo est exagéré.



Ça l'air bien compliqué toute cette histoire.


Maintenant, tu peux peut-être te demander pourquoi j'attends que tu
complètes le cryptosystème au lieu de déchiqueter l'existant ?


J'imagine c'est pour tenter de trouver un faille dans chiffré2.

- c'est devenu compliqué (mais pas plus sûr) donc long à tester.
- ton procédé a déjà des fautes de principes, à voir plus tard :-]



Ne serait-il pas préférable de parler de ces fautes de principes tout de
suite afin d'éviter une perte de temps plus tard dans la correction?


- j'attends que tu introduises la faiblesse supplémentaire qui va faire
s'écrouler l'existant.


Disons, que j'ai l'intention de rendre encore plus fort le principe de
ce chiffré2 puisqu'il normalement le chiffré2 devrait être beaucoup plus
court que le chiffré1, donc moins de problème pour la longueur de la 'clef
privée' (phrase de passe).

Ton dilemne est le suivant :
1/ Soit tu imposes à tes utilisateurs une clé
aussi longue que le clair et à changer tout le temps. Ca marche, mais
autant faire du Vigenère.


Pas besoin que la clef privée (phrase de passe) soit aussi longue que le
clair puisque c'est la clef de session qui s'occupe du chiffrage de
chiffré1. À moins que vous parliez du chiffrage de chiffré2 uniquement!

2/ Soit tu imposes à tes utilisateurs une clé bien moins longue et
facile à retenir qu'ils pourront réutiliser.



C'est ce qui est question depuis le début. Il ne s'agit pas de la clef
de session ici mais de la clef privé (phrase de passe) qui doit être d'un
minimum de caractères: disons 128 bits minimum. Existe-t-il un pays dont la
loi exige moins de 128 bits pour une clef? Si je ne me trompe la France
tolère jusqu'à 128 bits!

J'attends patiemment que tu pourrisses ton système en l'achevant, dans
les deux sens courants de ce terme :-p


C'est toute une salutation! ?????????

Bonne journée
r.h.



Avatar
Raymond H.
Bonjour,

"Christophe HENRY" a écrit dans le
message de news: cui663$2b1t$

Car avant de sauter à
cette étape-là il faudrait conclure cette étape-ci afin que cette
étape-ci
du simple algo soit sûre.


Elle est (on va dire) aussi sûre qu'un vigenère sur lequel on n'utilise
pas le même mot de passe deux fois. La question est donc réglée.


Disons qu'il n'est pas vraiment comparable à Vigenère qui lui utilise un
mot (comme clef de chiffrage) d'une longueur limitée et qui peut donner des
répétitions dans le chiffré. Ok, on passe à l'étape suivante.


Donc: 'f1' pour la fonction du chiffrage fait à partir de la clef de
session (maintenant nommé 's') et du clair 'm' ou 'm1'.


C'était trop simple d'utiliser des noms de fonctions qui rappellent le
traitement fait au code ?!


:-o C'est le plus simple: f = fonction. Le numéro qui suit f indique
quelle fonction on utilise: donc, 1re fonction (f1) ou 2e fonction (f2); et
même f pour la fonction globale qui contient les deux fonctions f1 et f2.
Donc, 'f = f1 || f2' si on peut l'écrire ainsi.

La fonction chiffrant la clef de session finale et le code
d'identification serait indiquée par 'f2'. Donc, 'c = f1(m,si) ||
f2(sf,ci)'. 'ci' pour le code d'identification.


Laisse tomber ce "code d'identification", il n'apporte aucune robustesse
supplémentaire au procédé. Ca complique inutilement l'ensemble.


Il est nécessaire pour la reconnaissance de la bonne phrase de passe
(clef personnelle ou clef privée), car il refuse qu'on chiffre deux fois un
même fichier par erreur si on a écrit la mauvaise clef personnelle (privée)
pour le déchiffrement. Je l'ai expliqué dans mon dernier message (dans le
temps).

Ce n'est pas de la programmation ici. Ce sont des mathématiques. Elles
ont la particularité d'empêcher tout brouillage des pistes.
Des données subissent des traitements à travers une fonction. En
entrée, on a _toutes_ les composantes impliquées et en sortie on a un
résultat.


En math on peut donner la valeur d'entrée voulue aussi; car une fonction
ne peut-elle pas en appeler une autre? Car si on dit qu'il faille donner
toutes les composantes sources en entré, alors 'c = f(m,k)' sert à désigner
la totalité de l'algo dans ces deux parties (c1 et c2), ce qui fait que f1
et f2 n'ont plus leur raison d'être. N'est-ce pas? Pas de problème pour
moi si vous préférez ainsi.

sinon ki n'est pas trouvé. Donc, si pour trouver k (clef de session
complète) il faut faire 'k = ses(mr1,ki)' [mr1= résultat de m
incrémenté], alors pour trouver ki il faudrait faire l'inverse à
partir de la clef de session finale, donc 'ki = ses_1(mr1,kf)'.


En fait, une faiblesse devrait être ajoutée lorsque tu auras complété
ton procédé.


:-) 'devrait'? Plutôt 'pourrait' :-)

Cela me permettra de trouver la bonne taille. Mais
j'attends toujours...


Bonne journée
r.h.


Avatar
Christophe HENRY

Non.
Pour le moment, la clé est ce que tu appeles "clé de session".


Pourtant on a décidé de nommer 'k' la phrase de passe. On a donc
accepté que la phrase de passe soit une clef, et je la nomme 'clef
personnelle'.


Un algorithme vulnérable à une attaque en clair connu ne l'est
évidemment, pour cet angle-là, que si la clé est réutilisée. Or, tu te
protèges contre cela en affirmant que la clé de session sera
imprévisible (on va dire) et qu'elle sera chiffrée par la phrase de
passe de l'utilisateur. D'un point de vue externe, la phrase de passe est
la clé pour le chiffrement. La clé de session n'étant qu'un
sous-produit du procédé.


C'est du _logiciel_. L'aspect logiciel est complétement hors-sujet
là-dedans. Il s'agit d'un confort d'interface, graphique en l'occurence.
Cela n'ajoute strictement rien à la robustesse de ton procédé. Afin de
clarifier l'étude, retire (s'il te plait) cet aspect de ton exposé.


Désolé! Je ne peux pas, car c'est nécessaire même. Ce n'est pas une
question d'interface.

Je m'explique. Pour déchiffrer, si l'algo ne reconnaît pas lorsque
l'utilisateur se trompe en tapant la mauvaise clef personnelle (phrase de
passe) alors l'algo va chiffrer le chiffré d'une autre façon, au lieu de le
déchiffrer; et l'utilisateur pourrait être dans la confusion en ayant un
chiffré qui est chiffré deux fois.


Désolé d'être subtilement sectaire, mais je ne m'intéresse qu'aux cas
où l'utilisateur a la bonne clé. Le reste, c'est du confort d'interface.
C'est peut-être nécessaire pour le vendeur du logiciel afin de ne pas
donner d'image brouillonne du produit, mais en terme de cryptologie ça
n'a rien à faire ici.
Ca me complique les écritures et en plus cela pourrait affaiblir l'algo
en fournissant un test d'arrêt pour la phrase de passe.


...
il s'arrête là donnant un message disant que la clef
personnelle est fausse.


Un *message* ! C'est de l'interface graphique. Berk ! Ton procédé
devrait être indépendant de toute interface graphique.


Ce que l'utilisateur connaît de lui seul est donc la 'clef
personnelle' (phrase de passe). Je pense à ça tout d'un coup:
'personnelle' signifie 'privé', et justement ce terme existe: 'clef
privée'. J'utiliserais donc ce terme pour désigner la phrase de passe
au lieu de 'clef personnelle'. Qu'en dites-vous?


Râa non alors ! Ce n'est pas du tout la même chose. Le terme "clé
privée" est liée à la cryptographie asymétrique. Tu fais du
symétrique : tu _dois_ distribuer tes clés.
Dans la cryptographie asymétrique, tu n'as pas ce soucis.


En fait, il te suffit de chiffer la clé de session avec l'algorithme
CAST5 de gnupg et je serai très gêné ! La clé de ton utilisateur
serait alors la clé passée à gnupg pour chiffrer ta clé de
session...


Vous voulez dire que ce serait une bonne chose d'utiliser GAST5 pour
le
chiffré2 ? Cela demande plein de question.

-Est-ce un algo très sûr?


Je m'en porte garant et je ne dois pas être le seul.


- Existe-t-il une dll pour être utilisé en VB?


Je ne sais pas. Mais ce serait étonnant. Autant demander un pot
catalytique pour une bicyclette.


- Aie-je le droit de l'utiliser dans mon logiciel commercial?


Il faut voir avec les bibliothèques qui sont parfois en LGPL.


- Est-il compliqué à utiliser?


Chez moi : un clic je chiffre, un clic je signe éléctroniquement. En
ligne de commande il est très efficace. Exemple :

"gpg --symmetric test" va demander une clé et générer de suite le
fichier /test.gpg/

"gpg --decrypt test.gpg" le déchiffre en demandant la même clé.


- Quelle est la taille de la DLL ou du code source?


Je ne sais pas.


- Crypte-t-il un maximum d'octets à la fois?


Plein plein. Je dirais que la seule limite est l'espace disque. En tout
cas, ça signe numériquement mes cdroms.


"GnuPG se compile et fonctionne sur beaucoup de systèmes, mais à cause
du manque d'une bonne source d'entropie testée, il doit être utilisé
avec précaution."

Cette phrase ne donne pas une grande confiance dans GnuPG. J'imagine que
ce sont des codes sources qui se compile en C.


Il est question de la génération d'une clé de session _vraiment_
imprévisible. La comparaison sur ce point entre gnupg et le ton procédé
sur VB est comme comparer une feuille de papier à la muraille de chine.

Si tu n'as pas confiance en gnupg, jette Allcrypter.


Je trouve que 3 Mo pour chiffrer la finale du simple algo est exagéré.


Pour être franc, c'était une boutade :-o
Il serait mieux que tu conserves ton interface graphique et que tu la
connectes sur gnupg. Thunderbird, Psi et d'autres Logiciels Libres font
ça très bien. Et je les utilises tous les jours.


- c'est devenu compliqué (mais pas plus sûr) donc long à tester. -
ton procédé a déjà des fautes de principes, à voir plus tard :-]



Ne serait-il pas préférable de parler de ces fautes de principes
tout de suite afin d'éviter une perte de temps plus tard dans la
correction?


Si j'étais payé pour faire ce travail, oui. Mais ça va être un peu
long et il se peut que je me trompe. Alors je préfère faire l'ensemble
des étapes en une seule fois.

--
Christophe HENRY
(sans lkm)
GnuPG : 3922239E60036EC86BF7268A877C52AC 4883C02A


2 3 4 5 6