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.

5 réponses

2 3 4 5 6
Avatar
Raymond H.
Bonjour,
"Christophe HENRY" a écrit dans le
message de news: culq96$mrk$

Soit. Présente tous tes calculs, "code" y-compris. De manière claire,
concise en reportant les détails à la fin. Normalement, une simple page
de ton logiciel de forum (Outlook express) devrait contenir les
spécifications globales.


Reçu. J'ai plusieurs possibilités de calcul mais je vais sûrement
essayer de faire simple. Je pourrais utiliser les valeurs du code
d'indentification dans le calcul mais je pourrais aussi ne pas en tenir
compte. Je verrai. Je prends un temps pour y réfléchir car tout n'est pas
fait encore.


Mais vous préférez vous moquer de moi en public.


C'est juste une bourrade pour te dire de manière subtile et furtive :
"c'est quand qut tu fais pêter l'algo complet !?". En principe,
c'est fait pour te piquer un peu et te pousser à lever les doutes.


Dans ce cas, c'est un genre de suspense :-)

...
Alors, j'ai fais comme si vous n'aviez rien compris de tout ça.


Et bien, un bon moyen d'éviter que mes écrits ne dégénèrent en troll est
de révéler la _totalité_ des spécifications sans qu'aucun des verbes
ne soit conjugué au conditionnel.


Je mets au conditionnel certains de mes verbes car il y a plusieurs
possibilités de faire quelquefois.


Respectueusement!


La dernière lettre de cette phrase (de passe) est menaçante :-o


Soyez rassuré, votre vie n'est pas en danger ;-)
Passez une bonne journée
r.h.


Avatar
Raymond H.
Bonjour,
"Christophe HENRY" a écrit dans le
message de news: culp1d$mdp$

f(m,k) = xor(per(inc(m)),s)
s = g(ses(inc(m),k),p)
Avec g() la fameuse fonction (à définir) de chiffrement de 's' la clé
de session.


Disons 'fs' (pour fonction chiffrant s) au lieu de 'g'. Même là, ce
n'est pas la clef de session complète qui doit être chiffrée mais sf
(clef
de session finale) via k (clef personnelle). Et pourquoi ne pas laisser
'f'
pour peu importe la fonction, ça serait les valeurs sources de cette
fonction qui déterminerais la fonction elle-même.


Je ne sais pas réfléchir comme cela. J'ai besoin d'un identifiant
différent pour chaque donnée ou traitement que je manipule.


D'accord. Donc, 'f() pour donner c', f1() pour c1, et f2() pour donner
c2. Ainsi, 'f() = f1() || f2()' et 'c = c1 || c2'.

Je vais prendre un temps pour réfléchir l'étape 5.
Bonne fin de semaine.
Raymond H.



Avatar
Erwann ABALEA
Bonjour,

On Sat, 12 Feb 2005, Raymond H. wrote:

"Erwann ABALEA" a écrit dans le message de news:

- que si tu mets en place une telle technique, alors tu affaiblis ton
système, en fournissant un test d'arrêt exploitable.


Un arrêt via un message à l'écran ne permet pas nécessairement
d'exploiter les valeurs des variables puisque dans ce cas celles-ci peuvent
être vidées de leurs données juste avant l'affichage du message. Ce n'est
donc pas un problème.


Là encore, tu mélanges. Si ton logiciel affiche un popup, ou fait "bip",
ou autre, c'est parce qu'une condition précise a eu lieu (détection de
code erroné). Un logiciel (autre que le tien) mettant en oeuvre ton algo
n'aura peut-être pas de popup ou de bip, mais pourra quand même utiliser
l'existence de cette condition pour savoir facilement si la phrase de
passe saisie est correcte ou non, et agir en conséquence. En incluant
cette vérification du code, tu permets à un attaquant de déterminer
facilement si le code testé est le bon. Ne raisonne pas en terme
d'interface graphique ou en terme d'interaction avec votre logiciel, ne
pense qu'à ton algorithme.

<Hors Charte>

Respectueusement!


Marrant comme un simple caractère (ici le '!') change le sens d'une
expression.


Excusez mon français s'il n'est pas au point. J'ai vite écris en
mettant un point d'exclamation et ce n'est pas dans un sens négatif.


Le point d'exclamation n'ajoute pas d'idée négative, mais peut signifier
de la surprise, de la joie, de l'indignation, ...

Bonne journée. (ou 'Bonne journée!' ou 'Bonne journée,'. C'est du pareil au
même pour moi).


Et "Bonne journée?", ou bien "BONNE JOURNEE!", est-ce que ça a le même
sens pour toi aussi? ;)

Si tu dis à tes collègues le matin "BONJOUR!" en faisant une grimace, au
lieu de "Bonjour" avec un sourire, est-ce que c'est pareil pour eux et
toi? :)

</Hors Charte>

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
Jesus saves! Passes to Moses, he shoots. He SCORES!



Avatar
Mister Jack
Salut !

Raymond H. wrote:
Je vais prendre un temps pour réfléchir l'étape 5.


C'est beau la persévérance.

Cordialement,
--
Mister Jack (MJ)
"Linux c'est pas pour les manchots !"

Avatar
Raymond H.
"Mister Jack" a écrit dans le message de news:
420f6af4$0$8223$
Salut !

Raymond H. wrote:
Je vais prendre un temps pour réfléchir l'étape 5.


C'est beau la persévérance.

Cordialement,


:-)


2 3 4 5 6