Je pense avoir un problème avec le client et server random.
Question:
Faut-il transformer ces octets de big endian vers little endian?
Je pense avoir un problème avec le client et server random.
Question:
Faut-il transformer ces octets de big endian vers little endian?
Je pense avoir un problème avec le client et server random.
Question:
Faut-il transformer ces octets de big endian vers little endian?
De plus, il faut bien rester synchronisé avec les messages et
ne pas en sauter. Le premier message chiffré dans chaque sens est
un message "Finished", et pas les données directement.
According to Big joke :Je pense avoir un problème avec le client et server random.
Question:
Faut-il transformer ces octets de big endian vers little endian?
Non. Ce sont 32 octets complètement anonymes. Même les 4 premiers octets
de "timestamp" sont à traiter comme les autres ; d'ailleurs, rien
n'impose au juste un client de mettre un timestamp correct (en fait, le
standard décrivant SSL/TLS impose au serveur de ne pas s'offusquer même
s'il trouve n'importe quoi en lieu et place du timestamp).
La dérivation des clés (de chiffrement et de MAC) utilise la "PRF"
(pseudo-random function) spécifique à SSL/TLS pour faire le boulot.
Cette fonction va utiliser le random du serveur, celui du client,
et le "master secret". Quelques points importants :
-- Il y a SSL 3.0 et TLS 1.0. TLS 1.0 est en fait SSL 3.1. TLS 1.0 est
standard, et décrit par la RFC 2246. SSL 3.0 n'est pas standard ; on
doit pouvoir trouver un draft sur le site web de Netscape (en cherchant
bien à coups de google). SSL 3.0 et TLS 1.0 n'utilisent PAS la même
PRF. La version utilisée pour un échange donné est celle utilisée
par le serveur dans son "ServerHello".
-- Même si c'est pour faire du SSL 3.0 ou 3.1, certaines implémentations
envoient un ClientHello en SSL 2.0 (mais spécifiant que le SSL 3.0 est
supporté) ; la RFC 2246 indique comment est calculé le "client random"
dans ce cas-là.
-- Pour calculer les clés, on utiliser les deux randoms et le "master
secret". Le "master secret" est lui-même dérivé du "pre-master secret"
(et des deux randoms) avec la PRF. Ce qui veut dire qu'entre le
pre-master secret (le mot de 48 octets commençant par la version et
chiffré en RSA, si le serveur utilise une clé RSA) et les clés de
chiffrement, il y a _deux_ couches de PRF. On en oublie facilement une,
surtout que le "master secret" fait lui aussi 48 octets de long.
-- Ne pas oublier qu'il y a deux clés de chiffrement, une dans chaque
sens. De plus, il faut bien rester synchronisé avec les messages et
ne pas en sauter. Le premier message chiffré dans chaque sens est
un message "Finished", et pas les données directement.
En résumé : c'est compliqué. Il semblerait que l'outil ssldump
(http://www.rtfm.com/ssldump/) fasse déjà tout ce boulot. Sinon,
il est toujours possible de regarder dans le code source d'OpenSSL
(http://www.openssl.org/) mais ce code source est crade et peu lisible.
--Thomas Pornin
De plus, il faut bien rester synchronisé avec les messages et
ne pas en sauter. Le premier message chiffré dans chaque sens est
un message "Finished", et pas les données directement.
According to Big joke <choupito2003@yahoo.fr>:
Je pense avoir un problème avec le client et server random.
Question:
Faut-il transformer ces octets de big endian vers little endian?
Non. Ce sont 32 octets complètement anonymes. Même les 4 premiers octets
de "timestamp" sont à traiter comme les autres ; d'ailleurs, rien
n'impose au juste un client de mettre un timestamp correct (en fait, le
standard décrivant SSL/TLS impose au serveur de ne pas s'offusquer même
s'il trouve n'importe quoi en lieu et place du timestamp).
La dérivation des clés (de chiffrement et de MAC) utilise la "PRF"
(pseudo-random function) spécifique à SSL/TLS pour faire le boulot.
Cette fonction va utiliser le random du serveur, celui du client,
et le "master secret". Quelques points importants :
-- Il y a SSL 3.0 et TLS 1.0. TLS 1.0 est en fait SSL 3.1. TLS 1.0 est
standard, et décrit par la RFC 2246. SSL 3.0 n'est pas standard ; on
doit pouvoir trouver un draft sur le site web de Netscape (en cherchant
bien à coups de google). SSL 3.0 et TLS 1.0 n'utilisent PAS la même
PRF. La version utilisée pour un échange donné est celle utilisée
par le serveur dans son "ServerHello".
-- Même si c'est pour faire du SSL 3.0 ou 3.1, certaines implémentations
envoient un ClientHello en SSL 2.0 (mais spécifiant que le SSL 3.0 est
supporté) ; la RFC 2246 indique comment est calculé le "client random"
dans ce cas-là.
-- Pour calculer les clés, on utiliser les deux randoms et le "master
secret". Le "master secret" est lui-même dérivé du "pre-master secret"
(et des deux randoms) avec la PRF. Ce qui veut dire qu'entre le
pre-master secret (le mot de 48 octets commençant par la version et
chiffré en RSA, si le serveur utilise une clé RSA) et les clés de
chiffrement, il y a _deux_ couches de PRF. On en oublie facilement une,
surtout que le "master secret" fait lui aussi 48 octets de long.
-- Ne pas oublier qu'il y a deux clés de chiffrement, une dans chaque
sens. De plus, il faut bien rester synchronisé avec les messages et
ne pas en sauter. Le premier message chiffré dans chaque sens est
un message "Finished", et pas les données directement.
En résumé : c'est compliqué. Il semblerait que l'outil ssldump
(http://www.rtfm.com/ssldump/) fasse déjà tout ce boulot. Sinon,
il est toujours possible de regarder dans le code source d'OpenSSL
(http://www.openssl.org/) mais ce code source est crade et peu lisible.
--Thomas Pornin
De plus, il faut bien rester synchronisé avec les messages et
ne pas en sauter. Le premier message chiffré dans chaque sens est
un message "Finished", et pas les données directement.
According to Big joke :Je pense avoir un problème avec le client et server random.
Question:
Faut-il transformer ces octets de big endian vers little endian?
Non. Ce sont 32 octets complètement anonymes. Même les 4 premiers octets
de "timestamp" sont à traiter comme les autres ; d'ailleurs, rien
n'impose au juste un client de mettre un timestamp correct (en fait, le
standard décrivant SSL/TLS impose au serveur de ne pas s'offusquer même
s'il trouve n'importe quoi en lieu et place du timestamp).
La dérivation des clés (de chiffrement et de MAC) utilise la "PRF"
(pseudo-random function) spécifique à SSL/TLS pour faire le boulot.
Cette fonction va utiliser le random du serveur, celui du client,
et le "master secret". Quelques points importants :
-- Il y a SSL 3.0 et TLS 1.0. TLS 1.0 est en fait SSL 3.1. TLS 1.0 est
standard, et décrit par la RFC 2246. SSL 3.0 n'est pas standard ; on
doit pouvoir trouver un draft sur le site web de Netscape (en cherchant
bien à coups de google). SSL 3.0 et TLS 1.0 n'utilisent PAS la même
PRF. La version utilisée pour un échange donné est celle utilisée
par le serveur dans son "ServerHello".
-- Même si c'est pour faire du SSL 3.0 ou 3.1, certaines implémentations
envoient un ClientHello en SSL 2.0 (mais spécifiant que le SSL 3.0 est
supporté) ; la RFC 2246 indique comment est calculé le "client random"
dans ce cas-là.
-- Pour calculer les clés, on utiliser les deux randoms et le "master
secret". Le "master secret" est lui-même dérivé du "pre-master secret"
(et des deux randoms) avec la PRF. Ce qui veut dire qu'entre le
pre-master secret (le mot de 48 octets commençant par la version et
chiffré en RSA, si le serveur utilise une clé RSA) et les clés de
chiffrement, il y a _deux_ couches de PRF. On en oublie facilement une,
surtout que le "master secret" fait lui aussi 48 octets de long.
-- Ne pas oublier qu'il y a deux clés de chiffrement, une dans chaque
sens. De plus, il faut bien rester synchronisé avec les messages et
ne pas en sauter. Le premier message chiffré dans chaque sens est
un message "Finished", et pas les données directement.
En résumé : c'est compliqué. Il semblerait que l'outil ssldump
(http://www.rtfm.com/ssldump/) fasse déjà tout ce boulot. Sinon,
il est toujours possible de regarder dans le code source d'OpenSSL
(http://www.openssl.org/) mais ce code source est crade et peu lisible.
--Thomas Pornin
Au niveau synchro, tu me confirmes que si je saute un msg, je ne
pourrais pas décrypter le suivant?
Ceci est vrai que je sois en block cipher ou stream cipher?
( ici RC4 = stream cipher)
Dernière question (j'éspère), les data encryptées extraites de la
trace réseau, j'inverse les octets avant de décrypter sur wintel? ( là
je fatigue :-))
Au niveau synchro, tu me confirmes que si je saute un msg, je ne
pourrais pas décrypter le suivant?
Ceci est vrai que je sois en block cipher ou stream cipher?
( ici RC4 = stream cipher)
Dernière question (j'éspère), les data encryptées extraites de la
trace réseau, j'inverse les octets avant de décrypter sur wintel? ( là
je fatigue :-))
Au niveau synchro, tu me confirmes que si je saute un msg, je ne
pourrais pas décrypter le suivant?
Ceci est vrai que je sois en block cipher ou stream cipher?
( ici RC4 = stream cipher)
Dernière question (j'éspère), les data encryptées extraites de la
trace réseau, j'inverse les octets avant de décrypter sur wintel? ( là
je fatigue :-))