OVH Cloud OVH Cloud

E0, E21, E22 etc.

16 réponses
Avatar
Arnold McDonald \(AMcD®\)
Je viens de passer une bonne heure à moteurderecherchizer, impossible de
mettre la main sur le détail de ces algorithmes. Bon, on trouve bien un
petit pdf présentant un (quasi)imbitable organigramme sur E0...

Quelqu'un a un lien vers des infos concrètes ?

Thx

--
Arnold McDonald (AMcD®)

http://arnold.mcdonald.free.fr/

6 réponses

1 2
Avatar
Arnold McDonald \(AMcD®\)
Oui, la puissance de calcul, il est clair que si chaque transaction entre
les modules nécessite 500 ms, c'est handicapant. Certes, 500 ms de temps de
calcul, c'est aujourd'hui considérable ! Mais n'oublions pas que dès qu'il
s'agit de réseau, il n'y a plus que le seul temps processeur à prendre en
compte :-).

Pour simplifier, c'est un client qui s'adresse à un serveur. Je pense à un
truc simple. Pour une méthode d'authentification, une procédure à la
Bluetooth me semble être très efficcae. La partie privée (que l'on peut voir
comme clé privée) du module peut très bien être l'adresse IP ou MAC, à
priori unique. Bon, ensuite, un bon générateur aléatoire, des algos de
chiffrement pas trop pénalisants en temps de calcul et ça peut rouler.

Résumons donc pour ceux qui n'ont pas tout saisi.

1) J'ai un module A, client, qui veut établir une communication avec un
module B, disons un serveur.
2) A et B possèdent des paramètres "privés", névessaires pour une procédure
d'identification à la Bluetooth. On peut choisir l'IP, l'adresse MAC, etc.
Pour ceux qui n'ont pas fouillé en détail le Bluetooth, la procédure
d'établissement d'authentification peut être résumée ainsi :

Le module B génére un aléatoire X et calcule un nombre K = E22(X,Y,T). E22
est un algorithme détaillé dans les liens fournis par l'ami Drapel, Y le
paramètre "privé" identifiant le module B (un code PIN pour un périphérique
Bluetooth, par exemple l'adresse IP pour mon client). L est la longueur du
paramètre Y.

Le module A en fait autant. Les deux modules s'échangent ensuite leur K
respectifs. Noter que, X et Y ne transitent pas sur le réseau.

Une fois K reçu, chaque module calcule C = Z XOR K. Z étant un autre
aléatoire (oui, faut un générateur aléatoire du feu de dieu). À partir
d'ici, chaque module possède donc un paramètre C "dépendant" de l'autre
module.

Le Bluetooth exécute encore une autre étape (chaque module), similaire à la
précédente (K et C), autre aléas, calculs de La et Lb à partir des algos
E21, Lab = La XOR Lb puis un Sa = E1(..., Lab) pour le module A et un Sb
pour le module B. Pour les détails, voir les liens cités plus haut.

Ici, si Sa = Sb, A peut faire confiance à B et établir la communication.

Mais bon, les algos E0, E21 et E1, le calcul de tous ces nombres aléatoires,
etc. Cela me semble bien lourd ! Disons que le procédé me plaît, mais
l'implémentation est trop lourde pour de simples dialogues Client/Serveur.
N'étant pas matheux, je ne me lancerai pas dans une tentative de
simplification du protocole d'identification/authentification de BT ;-), et
n'étant pas un spécialiste des certificats et autres protocoles de
signature, je ne sais pas si des méthodes plus simples sont possibles.

Ce genre de procédé me semble bien plus pratique qu'utiliser, par exemple,
du RSA pour sécuriser un tant soit peu des échanges client/serveur. D'autant
plus que si la clé privée est trouvée (désassemblage, etc.), ben le
processus est mort. Avec un système à la BlueTooth, si le (les) paramètre
privé est reversé/découvert, je peux toujours en envoyer un autre au module.
Une clé privée, c'est assez "fixe", alors qu'un paramètre "flottant", genre
adresse IP est, amha, moins pénalisant. Je m'explique, si j'ai 1000 modules,
je vais pas créer 1000 clés privées, surtout du RSA x bits ! Donc, en gros,
même clé privée pour tous. Si la clé est cassée, tous les modules sont
morts. Si c'est l'IP, seul le module de l'IP cassée est compromis. Enfin
bon, c'est la reflexion que je me fais à 4h du mat' après quelques heures
sur un texte d'authentification de messages :-).

Donc, j'ai demandé des détails sur E0, E1, E21 et compagnie pour étudier un
peu le truc. Là, je suis sur E0, erf, niveau implémentation facile, temps de
calcul etc, j'ai vu mieux quand même.

Donc, je pose naïvement la question (étant est que quelqu'un est compris mon
post tardif) qui peut me proposer un protocole d'échange pour mes modules un
tant soit peu simple (à la BlueTooth quoi) et un tant soit peu pratique à
mettre en place. En gros, sans passer par des certificats complexes, des
autorités de certifs, des paramètres privés de folie, etc., c'est à dire, le
contraire de tout ce que je trouve sur le sujet dès que je cherche un peu...

Sinon, suggerez un bon livre sur le sujet, excepté l'excellent Stallings, vu
que j'y suis en plein dedans :-).

Merci.

--
Arnold McDonald (AMcD®)

http://arnold.mcdonald.free.fr/
Avatar
Johann.D
"Arnold McDonald (AMcD®)" a écrit dans le message
de news:42e5996b$0$13302$

Pour simplifier, c'est un client qui s'adresse à un serveur. Je pense à un
truc simple. Pour une méthode d'authentification, une procédure à la
Bluetooth me semble être très efficcae. La partie privée (que l'on peut
voir

comme clé privée) du module peut très bien être l'adresse IP ou MAC, à
priori unique. Bon, ensuite, un bon générateur aléatoire, des algos de
chiffrement pas trop pénalisants en temps de calcul et ça peut rouler.


Je reviens sur la question de Sylvain et notamment sur la puissance de
calcul des "modules" à laquelle tu n'as pas vraiment donné de réponse.

En l'occurrence lorsque tu parles de clients qui s'adressent à un serveur,
la problématique n'est pas la même selon que le client est un PIC au bout
d'un réseau de terrain ou un PC sur un réseau local. Evidemment si on se
limite à la puissance de calcul du PIC le XOR peut être le seul algo de
chiffrement utilisable en pratique (mais quid du générateur aléatoire sur ce
type de cible ?). Par contre si ton client est capable d'exécuter un
Blowfish CBC (ou un 3DES, ou ce que tu veux d'autre) sans impact sur tes
performances, tu peux mettre en place une authentification mutuelle en 3
passes (et en 2 coups de cuiller à pot) :

0) le client A et le serveur B disposent d'une clé Kab (stockée
proprement...)
1) A génère un aléas Ra (8 octets), et envoie C1=C(Kab, Ra)
2) B retrouve Ra=D(Kab, C1), calcule Ra' (une transformation "simple" de Ra
comme un décalage d'un octet dans un sens ou dans l'autre), génère l'aléas
Rb (8 octets), et envoie la concaténation de C2=C(Kab, Ra') et C3=C(Kab, Rb)
3) A retrouve Ra'=D(Kab, C2) et vérifie ainsi que B est authentique. A
retrouve également Rb=D(Kab, C3), calcule Rb', et envoie C4=C(Kab, Rb')
4) B retrouve Rb'=D(Kab, C4) et vérifie ainsi que A est authentique
5) A et B dialoguent en chiffrement CBC en utilisant la concaténation de Ra
et de Rb (16 octets) comme clé de session Ks [1].


Maintenant comme ton soucis semble bien être d'authentifier individuellement
chaque client, il faut que la clé Kab soit propre à A et à B. "Il suffit"
alors de partir d'une clé racine commune à tous tes modules Kr, et de
définir Kab=C(Kr, numéro de série de A || numéro de série de B). Côté
serveur tu peux ainsi te contenter de stocker Kr (et de bien la protéger) et
recalculer Kab à chaque ouverture de session, côté client tu peux ne stocker
que Kab et éviter ainsi la compromission de l'ensemble en cas d'attaque
réussie sur le client... Bon, maintenant cela n'empêche pas d'avoir une Kr
qui varie avec le mois dans l'année, la plage d'adresse IP, la phase de la
lune ou l'âge du capitaine, mais l'idée est là.


[1] Petite optimisation, une fois la clé de session établie tu peux utiliser
un chiffrement à sens unique : par exemple lors d'un envoi de A vers B, la
trame transmise est C(Ks, xxx), et lors d'un envoi de B vers A, D(Ks, xxx).
Ainsi A ne fait que Chiffrer et B ne fait que Déchiffrer, ce qui évite
d'avoir à recharger les sous-clés à chaque tour.



Mes 2 centimes,

--
Johann.D

Avatar
Arnold McDonald \(AMcD®\)
Johann.D wrote:

En l'occurrence lorsque tu parles de clients qui s'adressent à un
serveur, la problématique n'est pas la même selon que le client est
un PIC au bout d'un réseau de terrain ou un PC sur un réseau local.


Les clients sont des PCs. La puissance de calcul n'est donc pas pénalisante,
mais, pour autant, il peut y avoir beaucoup de transactions, il ne faut donc
pas que les procédures d'authentifications soient longues.

Par contre si
ton client est capable d'exécuter un Blowfish CBC (ou un 3DES, ou ce
que tu veux d'autre) sans impact sur tes performances, tu peux mettre
en place une authentification mutuelle en 3 passes (et en 2 coups de
cuiller à pot) :


Voyons-voir...

0) le client A et le serveur B disposent d'une clé Kab (stockée
proprement...)


C'est déjà un problème ! En tant que vieux reverseur, j'ai craqué tellement
de trucs basés sur des paramètres privés, que je doute un peu de ce principe
:-). Ou alors, une autre forme de clé privée, comme je disais plus haut. Un
paramètre secret (qui permet d'identifier donc), mais qui peut changer
suivant les clients (comme une adresse IP), ce qui permet de ne pas
compromettre tous les clients si UNE clé privée est découverte. Quand je dis
adresse IP, comprendre "basé" sur l'adresse IP, pas l'adresse IP toute seule
bien évidemment.

1) A génère un aléas Ra (8 octets), et envoie C1=C(Kab, Ra)


Jusque là, ça va :-). Mais je me méfie quand même des protocoles à plusieurs
échanges. Je veux dire, une attaque "simple" est toujours faisable (j'ai
déjà pratiqué, je peux témoigner). Pour simplifier, je me place entre A et B
et intercepte tout ce qui passe. Pour les phases d'authentification, ce
n'est généralement pas compliqué à déceler, ce ne sont que quelques octets
et, souvent, certains sont redondants entre les premiers échanges. Les
transactions elles, occuppent des paquets plus importants. Bref, il m'est
arrivé de n'avoir qu'à reproduire les paquets "devinés" d'authentification
pour pouvoir me faire passer comme correct et déclencher une session. Il
faut donc que ce genre de méthode soit élaborée avec une certaine précaution
dirai-je...

2) B retrouve Ra=D(Kab, C1), calcule Ra' (une transformation "simple"
de Ra comme un décalage d'un octet dans un sens ou dans l'autre),
génère l'aléas Rb (8 octets), et envoie la concaténation de C2=C(Kab,
Ra') et C3=C(Kab, Rb) 3) A retrouve Ra'=D(Kab, C2) et vérifie ainsi
que B est authentique. A retrouve également Rb=D(Kab, C3), calcule
Rb', et envoie C4=C(Kab, Rb') 4) B retrouve Rb'=D(Kab, C4) et vérifie
ainsi que A est authentique 5) A et B dialoguent en chiffrement CBC
en utilisant la concaténation de Ra et de Rb (16 octets) comme clé de
session Ks [1].


Moui. Cela me semble correct. Sauf que j'agrandirai un peut certaines
tailles sans doute. 8 octets c'est assez bruteforçable quand même.

Maintenant comme ton soucis semble bien être d'authentifier
individuellement chaque client,


C'est le hic.

il faut que la clé Kab soit propre à
A et à B.


C'est sur ce que je bute :-).

"Il suffit" alors de partir d'une clé racine commune à tous
tes modules Kr, et de définir Kab=C(Kr, numéro de série de A ||
numéro de série de B). Côté serveur tu peux ainsi te contenter de
stocker Kr (et de bien la protéger)


Un serveur est en général en milieu sécurisé, donc difficilement reversable,
hackable, etc. Enfin, en général :-). C'est du côté client qu'il faut
trouver une méthode imparable, les clients sont eux, en général, en milieu
heu "hostile".

et recalculer Kab à chaque
ouverture de session, côté client tu peux ne stocker que Kab et
éviter ainsi la compromission de l'ensemble en cas d'attaque réussie
sur le client... Bon, maintenant cela n'empêche pas d'avoir une Kr
qui varie avec le mois dans l'année, la plage d'adresse IP, la phase
de la lune ou l'âge du capitaine, mais l'idée est là.


Oui, Kr est un peu le code PIN en Bluetooth, souvent a zéro et que tu peux
changer quand tu veux, si j'ai bien compris.

[1] Petite optimisation, une fois la clé de session établie tu peux
utiliser un chiffrement à sens unique : par exemple lors d'un envoi
de A vers B, la trame transmise est C(Ks, xxx), et lors d'un envoi de
B vers A, D(Ks, xxx). Ainsi A ne fait que Chiffrer et B ne fait que
Déchiffrer, ce qui évite d'avoir à recharger les sous-clés à chaque
tour.


Oui, c'est un autre problème cela. Chiffrer/déchiffrer à chaque transaction
? Authentifier à chaque transaction ? Conserver la clé de session pendant X
temps ? Etc. Tout cela étant gourmand en ressource, si simplification il y
a, c'est bienvenu.

Sinon, merci pour tes suggestions. Je vais relire tout ça tranquilement. Je
ne m'étais jamais réellement penché sur ce problème
d'authentification/signature/certification/etc auparavant (je veux dire, au
niveau code) et ai soigneusement évité de lire tout post à ce sujet
jusqu'ici :-). En fait, je suis assez circonspect. Depuis quelques jours, je
potasse un peu de littérature sur le sujet, dont l'excellent bouquin de
William Stallings, Cryptography and Network Security, qui traite de la chose
en long, en large et en travers et je me demande s'il y a une solution ! Je
veux dire, je viens de terminer les Hashes, les MACs, les authentification a
clés privées, à clés privées/publiques, etc. or, tout est soumis à tellement
de restrictions, tout est (dans une certaine mesure) tellement
comprometable, que je me demande si ce problème est résolvable de manière
sûre ! Enfin bon, il me reste encore le chapitre sur les signatures
numériques et les protocoles d'authentification à finir, mais bon, I'm
scratching my head, je me dis que tout cela est un boulot considérable pour
pas grand-chose au final... Mais c'est égal, le livre de Stalling est
vraiment excellent.

--
Arnold McDonald (AMcD®)

http://arnold.mcdonald.free.fr/

Avatar
Johann.D
"Arnold McDonald (AMcD®)" wrote:

C'est déjà un problème ! En tant que vieux reverseur, j'ai craqué
tellement

de trucs basés sur des paramètres privés, que je doute un peu de ce
principe

:-). Ou alors, une autre forme de clé privée, comme je disais plus haut.
Un

paramètre secret (qui permet d'identifier donc), mais qui peut changer
suivant les clients (comme une adresse IP), ce qui permet de ne pas
compromettre tous les clients si UNE clé privée est découverte. Quand je
dis

adresse IP, comprendre "basé" sur l'adresse IP, pas l'adresse IP toute
seule

bien évidemment.


Evidemment... Mais en utilisant une diversification de clé Kab = f(Kr, A, B)
(en résumé...) on ne promène dans la nature que la clé Kab, propre au client
A. L'idée est bien que chaque client ait sa propre clé, mais que le serveur
n'ait pas à les connaître toutes (puisse que lui peut refaire le calcul à
chaque connexion). Donc si ton client est torturé, il ne livrera que sa clé
à lui, pas celle des autres...

Au delà de ça j'ai du mal à voir comment l'utilisation d'un paramètre
"secret" (disons quelque chose dérivé du numéro de série et/ou de l'adresse
IP) peut réellement rester secret longtemps ? Si tu considères que
l'attaquant est capable de retrouver dans ton programme la valeur d'une clé
privée, il n'est pas loin d'être capable de retrouver selon quel algorithme
tu fabriques ton paramètre "secret", non ?

Maintenant, si le but est d'empêcher qu'un attaquant ayant déjà obtenu la
clé Kab puisse se faire passer pour le client A, effectivement on peut lui
complexifier la tâche en utilisant non pas directement Kab comme clé
d'authentification, mais plutôt Kab' = f(Kab, adresse IP du client). Dans ce
cas il faudra que non seulement il ait volé la clé "secrète", mais en plus
que vu du serveur il emprunte l'adresse du client. Pourquoi pas. Mais il y a
à mon avis un gros hic là dessus, c'est que ça interdit d'utiliser ton
principe de connexion dès qu'il y a de la translation d'adresse (NAT),
puisse que vu du serveur tous les clients du réseau NATé ont la même adresse
IP...


1) A génère un aléas Ra (8 octets), et envoie C1=C(Kab, Ra)


Jusque là, ça va :-). Mais je me méfie quand même des protocoles à
plusieurs

échanges. Je veux dire, une attaque "simple" est toujours faisable (j'ai
déjà pratiqué, je peux témoigner). Pour simplifier, je me place entre A et
B

et intercepte tout ce qui passe. Pour les phases d'authentification, ce
n'est généralement pas compliqué à déceler, ce ne sont que quelques octets
et, souvent, certains sont redondants entre les premiers échanges. Les
transactions elles, occuppent des paquets plus importants. Bref, il m'est
arrivé de n'avoir qu'à reproduire les paquets "devinés" d'authentification
pour pouvoir me faire passer comme correct et déclencher une session. Il
faut donc que ce genre de méthode soit élaborée avec une certaine
précaution

dirai-je...


A ce niveau, je n'ai pas inventé grand chose, c'est un principe que
j'utilise tous les jours pour l'authentification mutuelle entre une carte à
puce et une application côté PC. Je ne suis pas vraiment au courant ce que
ça implique mais la carte en question (avec ce type d'authentification) est
certifiée EAL4+, j'ai donc une certaine tendance à lui faire confiance. En
l'occurrence, il n'y a pas de redondance (le chiffré de R' n'a rien à voir
avec le chiffré de R si ton algorithme de chiffrement est raisonnablement
pas trop faible...). En tout et pour tout tu auras sniffé 3 trames dont les
données sont chiffrés avec la clé d'authentification, on ne chiffre qu'1 ou
2 blocs à la fois, et en plus le contenu de ces blocs est aléatoire (ce qui
empêche le rejeu). Je ne voudrais pas m'avancer au delà de mes compétences
mais ça me paraît difficile d'attaquer à ce niveau ?


2) B retrouve Ra=D(Kab, C1), calcule Ra' (une transformation "simple"
de Ra comme un décalage d'un octet dans un sens ou dans l'autre),
génère l'aléas Rb (8 octets), et envoie la concaténation de C2=C(Kab,
Ra') et C3=C(Kab, Rb) 3) A retrouve Ra'=D(Kab, C2) et vérifie ainsi
que B est authentique. A retrouve également Rb=D(Kab, C3), calcule
Rb', et envoie C4=C(Kab, Rb') 4) B retrouve Rb'=D(Kab, C4) et vérifie
ainsi que A est authentique 5) A et B dialoguent en chiffrement CBC
en utilisant la concaténation de Ra et de Rb (16 octets) comme clé de
session Ks [1].


Moui. Cela me semble correct. Sauf que j'agrandirai un peut certaines
tailles sans doute. 8 octets c'est assez bruteforçable quand même.


L'idée sous-jacente ici c'est d'ouvrir une session sécurisée, et qu'ici la
clé de session sera sur 128bits donc 2 x 8 octets. Tu peux rallonger à
loisir la longueur de Ra et Rb si tu souhaite une clé de session plus longue
(triple DES avec 3 clés, AES, ...), évidemment. Quant à considérer que les 8
octets sont bruteforçable, dans ce contexte je pense que non. Illustration
simple à l'étape 2 : B ne connaît pas la clé Kab. Il ne peut donc pas
retrouver Ra, l'aléas généré par A. Il invente donc son propre Ra'=Rpif, le
chiffre avec sa propre clé Kpif. Il envoie Rpif chiffré avec Kpif à A. Il y
a là non pas 8 bits mais 16 bits d'entropie, donc peu de chance pour que A
retrouve bien le Ra' qu'il attend. Donc A ferme la session. Au tour suivant
B revient avec l'espoir d'essayer un autre Rpif et un autre Kpif, sauf que
pour A on est reparti à zéro, il a donc généré un autre aléas Ra. AMHA (mais
je suis évidemment prêt à accuillir toutes les objections !) ton attaque par
force brut ne peut aboutir que si tu parviens à "coincer" le générateur
aléatoire de A pour qu'à chaque tour il te tire le même Ra.

Maintenant comme ton soucis semble bien être d'authentifier
individuellement chaque client,


C'est le hic.

il faut que la clé Kab soit propre à
A et à B.


C'est sur ce que je bute :-).

"Il suffit" alors de partir d'une clé racine commune à tous
tes modules Kr, et de définir Kab=C(Kr, numéro de série de A ||
numéro de série de B). Côté serveur tu peux ainsi te contenter de
stocker Kr (et de bien la protéger)


Un serveur est en général en milieu sécurisé, donc difficilement
reversable,

hackable, etc. Enfin, en général :-). C'est du côté client qu'il faut
trouver une méthode imparable, les clients sont eux, en général, en milieu
heu "hostile".


Oui, c'est un peu le principe aussi des cartes à puces qui sont dans les
poches des attaquants potentiels...

et recalculer Kab à chaque
ouverture de session, côté client tu peux ne stocker que Kab et
éviter ainsi la compromission de l'ensemble en cas d'attaque réussie
sur le client... Bon, maintenant cela n'empêche pas d'avoir une Kr
qui varie avec le mois dans l'année, la plage d'adresse IP, la phase
de la lune ou l'âge du capitaine, mais l'idée est là.


Oui, Kr est un peu le code PIN en Bluetooth, souvent a zéro et que tu peux
changer quand tu veux, si j'ai bien compris.


Oui et non. Si j'ai bien compris ton problème c'est de gérer un millier de
clients, l'idée est bien d'utilisée une clé différente pour chaque client
(mais déterministe pour ne pas avoir à stocker toutes les clés côté
serveur), donc Kr n'est jamais communiqué au client, au contraire d'un code
PIN.


[1] Petite optimisation, une fois la clé de session établie tu peux
utiliser un chiffrement à sens unique : par exemple lors d'un envoi
de A vers B, la trame transmise est C(Ks, xxx), et lors d'un envoi de
B vers A, D(Ks, xxx). Ainsi A ne fait que Chiffrer et B ne fait que
Déchiffrer, ce qui évite d'avoir à recharger les sous-clés à chaque
tour.



Correction, hum, j'ai écrit trop vite sur ce coup là, je crois que le
principal intérêt est que ça permet d'optimiser (en hard ou en taille de
code) un algorithme symétrique comme le 3DES en n'en implémentant qu'une
moitié. Arrêtez moi si je me trompe, mais je ne crois pas que ça change
quelque chose au niveau initialisation (on peut bien utiliser le même
contexte 3DES pour chiffrer ou déchiffrer sans recharger les clés, non ?).


Oui, c'est un autre problème cela. Chiffrer/déchiffrer à chaque
transaction

? Authentifier à chaque transaction ? Conserver la clé de session pendant
X

temps ? Etc. Tout cela étant gourmand en ressource, si simplification il y
a, c'est bienvenu.


Chiffrer et déchiffrer à chaque trame, oui, si tu ne veux que le contenu des
échanges reste privé. Auquel cas tu prends ta trame, tu ajoutes le padding
qui va bien et un code de détection d'erreur (checksum), et tu chiffres le
tout. A l'autre bout après déchiffrement tu compare le checksum pour
vérifier que le client a bien toujours la même clé de session. Maintenant si
tu veux juste authentifier les échanges (sans que le contenu ne soit
chiffré), tu calcules le checksum et tu envoies le checksum chiffré à la
suite des données en clair (MAC).

Si tu chiffres chacune des trames, je crois qu'il faut choisir
judicieusement l'IV de ton CBC, pour que chaque trame soit différente de sa
petite soeur qui pourtant véhicule le même contenu. Et après un certain
nombre d'échanges ou un certain temps, il faudre de toutes façons jeter la
clé de session.

Sinon, merci pour tes suggestions. Je vais relire tout ça tranquilement.
Je

ne m'étais jamais réellement penché sur ce problème
d'authentification/signature/certification/etc auparavant (je veux dire,
au

niveau code) et ai soigneusement évité de lire tout post à ce sujet
jusqu'ici :-). En fait, je suis assez circonspect. Depuis quelques jours,
je

potasse un peu de littérature sur le sujet, dont l'excellent bouquin de
William Stallings, Cryptography and Network Security, qui traite de la
chose

en long, en large et en travers et je me demande s'il y a une solution !
Je

veux dire, je viens de terminer les Hashes, les MACs, les authentification
a

clés privées, à clés privées/publiques, etc. or, tout est soumis à
tellement

de restrictions, tout est (dans une certaine mesure) tellement
comprometable, que je me demande si ce problème est résolvable de manière
sûre ! Enfin bon, il me reste encore le chapitre sur les signatures
numériques et les protocoles d'authentification à finir, mais bon, I'm
scratching my head, je me dis que tout cela est un boulot considérable
pour

pas grand-chose au final... Mais c'est égal, le livre de Stalling est
vraiment excellent.


Je n'ai pas lu cet ouvrage, mais ça m'étonnerait que ce principe ne soit pas
dans le chapitre sur les protocoles d'authentification...

C'est bien l'été, la plage, ça laisse du temps pour les bons bouquins ;-)

--
Johann.D


Avatar
Sylvain
Arnold McDonald (AMcD®) wrote on 26/07/2005 13:51:

Les clients sont des PCs. La puissance de calcul n'est donc pas pénalisante,
mais, pour autant, il peut y avoir beaucoup de transactions, il ne faut donc
pas que les procédures d'authentifications soient longues.



donc on parle d'auth. 1 à N (un serveur, N clients) et non entre 2
modules (cela a un impact car protéger N clients ne peut se faire comme
pour un seul).

btw, le protocole bluetooth est un protocole 1 to 1, (soit, on peut le
répéter N fois pour N devices à apairer), en cela il requiert (très
généralement) une intervention humaine de part et d'autre pour saisir le
PIN (seul aléa du mécanisme).

dans votre cas, le serveur doit (je suppose) être autonome dans sa prise
de décision; il en vient soit une clé maitre qui sera diversifié avec
une information client unique (schéma décrit par Johann), soit un
annuaire de clients pré-autorisés (cert propriétaires, X509, ID et PIN,
ou toute autre info.

le premier schéma n'est applicable que si le client a recours à un token
cryptographique (carte à puce par exemple), dans le cas contraire toute
dissimulation de secrets dans le code d'une appli (éxécutée en mode user
sur un système hostile) est voué à la compromission de ceux-ci.

pour le second cas, l'auth. utilisera une info saisie (donc les attaques
type key-logger resteront possibles); elle peut être très basique (et
unilatérale) (transmission d'un hash de l'idenfiant client et aléa
serveur, voir par exemple les mécanismes OTP) ou plus sophistiquée
(calcul de clé à partir de password (+IP, etc) puis échange de
cryptogramme, voir par exemple les protocoles décrits par ISO 9798).

concernant les échanges d'authentification, imho, au moins 2 échanges
sont requis pour une auth. standard et 3 pour un auth. Zero Knowledge;
si par ailleurs les échanges ("transactions") entre les 2 parties sont
nombreuses (à la suite de cette auth.) le cout de l'auth. elle même
tendra vers zéro.

crdlt,
Sylvain.

Avatar
Kevin Drapel
Tout ça pour dire que tu n'es pas nécessairement obligé de passer par
les algos E0 & cie. Je pense que le système d'authentification et
d'échange de clé proposé par Johann avec un AES-128 conviendrait tout à
fait. Pour l'aléa, Yarrow ou Fortuna. Et pour authentifier les paquets,
un HMAC sur les données (avec la clé utilisée pour le chiffrement). Des
implémentations en C existent pour tous ces algos (voir
libtomcrypt.org). Après il faut juste faire attention au mode
d'opération pour le chiffrement et comme l'a souligné Johann, changer
l'IV si cela se fait paquet par paquet.
1 2