OVH Cloud OVH Cloud

chiffrement et intégrité

16 réponses
Avatar
Sylvain
quel type de cipher recommenderiez-vous pour chiffrer et calculer un MAC,
idéalement en une seule passe ? (MAC devant garantir l'intégrité du msg à la
fin du déchiffrement)

merci,
Sylvain.

10 réponses

1 2
Avatar
Clement Seveillac
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Sylvain wrote:
quel type de cipher recommenderiez-vous pour chiffrer et calculer un MAC,
idéalement en une seule passe ? (MAC devant garantir l'intégrité du msg à la
fin du déchiffrement)


HMAC ?

Algo de MAC base sur une fonction de hash (comme SHA-1, ou MD5 mais
moins recommande), definie par une RFC [1] comme :

Hash(clef XOR opad, Hash(clef XOR ipad, text))

(ipaq et opad etant des constantes definies par le standard)

[1] http://www.ietf.org/rfc/rfc2104.txt

HTH,
- --
clem
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)
Comment: Secure Email! http://dudu.dyn.2-h.org/gpg-enigmail-howto

iQEVAwUBQZDOj5C029jjKP/wAQJGQwf/ez1g6K/HT5suR/GjWr2jsy6pgU63I8Rb
Yp9IrQrkWqv7vXw0ROioGep9KmpGIRHBVDzvExOTruLgDRGJwuk/V45bXMbRi16n
ifX/vL9eQkIQZqJhcWLUVgw9evQX5NgNw9EZyRRxxrGpibUbU2PR2xpJjH2StawT
HG5ITzz/XQp+bHd26GTKsNY02Rb8c4ULR9KjCdH1+4qxSi9Q4u6wzn0JJunGW63T
ZIRYpFwkXtRxRp0j3XXzSVFTUzPL9BuzUCTElajcQkJcISlqetU2KbNZAqpDy1sb
wn3/Pepp+e3d9hFk5A6FHWHxqBpq9lZIh4yH3BfrmPvuEKNksATQ/Q= =h3jn
-----END PGP SIGNATURE-----

Avatar
Johann Dantant
"Sylvain" a écrit dans le message de
news:4190117e$0$9804$
quel type de cipher recommenderiez-vous pour chiffrer et calculer un MAC,
idéalement en une seule passe ? (MAC devant garantir l'intégrité du msg à
la

fin du déchiffrement)


Je ne suis pas certain d'avoir bien cerné la question, mais lorsqu'on
effectue un chiffrement en CBC (3DES par exemple), on va commencer par
padder jusqu'à avoir une taille multiple de 8 octets. Dans certains cas le
padding peut même rajouter systématiquement un bloc particulier (constant ou
fonction de la longueur). A la fin du déchiffrement CBC, on ne va retrouver
le bon padding que s'il n'a pas eu d'erreur (on a bien la bonne clé et on
n'a loupé aucun bloc). AMHA c'est déjà un moyen honorable de valider le
message déchiffré, non ?

J.D.

Avatar
Francois Grieu
"Johann Dantant" dit:

lorsqu'on effectue un chiffrement en CBC (3DES par exemple), on va
commencer par padder jusqu'à avoir une taille multiple de 8 octets.
Dans certains cas le padding peut même rajouter systématiquement un
bloc particulier (constant ou fonction de la longueur). A la fin du
déchiffrement CBC, on ne va retrouver le bon padding que s'il n'a pas
eu d'erreur (on a bien la bonne clé et on n'a loupé aucun bloc).
AMHA c'est déjà un moyen honorable de valider le message déchiffré,
non ?


Attention toutefois: si l'adversaire, ou une erreur, altère un bloc
du chiffré autre qu'un des deux derniers blocs, la vérification
ci-dessus réussi, alors que deux blocs du clair sont altérés (celui
dont le chiffré est altéré, et le suivant).

Pour assurer l'intégrité, le mieux est d'utiliser une autre clé que
pour le chiffrement comme clé d'un MAC.
Comme MAC, on peut prendre par exemple HMAC-SHA1, ou CBC-MAC-TDES
(dernier bloc d'un chiffrement CBC).


François Grieu

Avatar
Sylvain
François, Johann, all,

merci pour vos réponses.

j'utilise actuellement (pour le chiffrement) un DES3-CBC avec un aléa
utilisé comme IV et comme "signature" en l'insérant à la fin du clair.

je n'ai réalisé que recemment que - comme expliqué par François - des blocs
faux au milieu du chiffré donne un clair incorrect (et dans mon cas je ne
peux pas le savoir, ie pas d'hypothèse sur le clair) uniquement pour le(s)
bloc(s) invalide(s) et le suivant (car le XOR ne porte que sur un chiffré et
le bloc suivant).

ce "défaut" me donne une "signature" finale juste mais un message
globalement faux (avec un risque de fournir des infos à l'attaquant si je
traite son message choisi).

je pourrais remplacer ce bloc signature finale par un XOR de tous les blocks
mais je traite de patterns répétitifs qui pourraient s'annuler (moins sur le
chiffré que sur le clair...), ou encore faire un classique MAC-DES3, cela
m'impose *hélas* de réaliser deux passes (paralléles ou non) avec 2 ciphers
différents; je ne peux pas non plus utiliser de hash car je ne dispose que
de 8 octets pour la signature; de plus s'agissant de code embarqué (avec un
tout petit µproc) j'espérais un moyen de faire qu'une seule passe.

d'autres pistes ?...

Sylvain.
Avatar
Sylvain
"Clement Seveillac" a écrit dans le message de
news: cmqiqa$ntr$
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Sylvain wrote:
quel type de cipher recommenderiez-vous pour chiffrer et calculer un
MAC,


idéalement en une seule passe ? (MAC devant garantir l'intégrité du msg
à la


fin du déchiffrement)


HMAC ?

Algo de MAC base sur une fonction de hash (comme SHA-1, ou MD5 mais
moins recommande), definie par une RFC [1] comme :

Hash(clef XOR opad, Hash(clef XOR ipad, text))

(ipaq et opad etant des constantes definies par le standard)

[1] http://www.ietf.org/rfc/rfc2104.txt

HTH,
- --
clem


merci pour votre réponse.

le hash (ou hmac) n'est pas applicable; 1) je n'ai pas la place de l'insérer
dans ma trame d'échange, 2) le code "chiffrant" s'exécute dans un DSP et le
code "déchiffrant" dans une carte à puce, je préfère limiter les algos à
porter (et consacrer le surplus de termps à renforcer les algos présents
plutôt que d'en rajouter) - le hmac exigerait de plus trop de mémoire (blocs
stockant le digest intermédiaire et les expansions de clé xorée).

je dispose par contre d'un DES3 et un XOR(64bits) n'est pas un problème...

Sylvain.


Avatar
Francois Grieu
"Sylvain" expose:

j'utilise actuellement (pour le chiffrement) un DES3-CBC avec un aléa
utilisé comme IV et comme "signature" en l'insérant à la fin du clair.

je n'ai réalisé que recemment que - comme expliqué par François - des blocs
faux au milieu du chiffré donne un clair incorrect (et dans mon cas je ne
peux pas le savoir, ie pas d'hypothèse sur le clair) uniquement pour le(s)
bloc(s) invalide(s) et le suivant (car le XOR ne porte que sur un chiffré et
le bloc suivant).

ce "défaut" me donne une "signature" finale juste mais un message
globalement faux (avec un risque de fournir des infos à l'attaquant si je
traite son message choisi).

je pourrais remplacer ce bloc signature finale par un XOR de tous les blocks
mais je traite de patterns répétitifs qui pourraient s'annuler (moins sur le
chiffré que sur le clair...), ou encore faire un classique MAC-DES3, cela
m'impose *hélas* de réaliser deux passes (paralléles ou non) avec 2 ciphers
différents; je ne peux pas non plus utiliser de hash car je ne dispose que
de 8 octets pour la signature; de plus s'agissant de code embarqué (avec un
tout petit µproc) j'espérais un moyen de faire qu'une seule passe.

d'autres pistes ?...


A ma conaissance, il n'existe pas de méthode qui assure complètement
chiffrement et intégrité avec seulement un chiffrement DES par bloc
de donnée.

Il y a toutefois des solutions moins couteuses que CBC-MAC-DES3: par
exemple les MACs ISO/IEC 9797-1 algorithmes 2, 3 et 4. Pour n blocks,
CBC-MAC-DES3 coute 3*n opérations DES, ces algorithmes ont respectivement
un coût n+1, n+2, et n+2 opérations. L'idée de base est de faire un
CBC-MAC simple, et d'ajouter quelque part une autre clé.

On part d'une clé double K, K' et d'un message D1..Dn (n>=1)

ISO/IEC 9797-1 algorithme 2:
H0 = 0
étapes 1 à n: Hj = Enc(K, Dj XOR H{j-1})
MAC = Enc(K', Hn)

ISO/IEC 9797-1 algorithme 3:
H0 = 0
étapes 1 à n: Hj = Enc(K, Dj XOR H{j-1})
MAC = Enc(K, Dec(K', Hn))

ISO/IEC 9797-1 algorithme 4:
Il faut que n>=2
On dérive K" par exemple comme K' XOR F0F0F0F0F0F0F0F0
[un des exemples non normatif proposé par ISO/IEC 9797-1]
H1 = Enc(K", Enc(K, D1))
étapes 2 à n: Hj = Enc(K, Dj XOR H{j-1})
MAC = Enc(K', Hn)

Cet exposé est notablement différent de celui de ISO/IEC 9797-1,
mais est j'espère équivalent. ISO/IEC 9797-1 défini aussi 3 methodes
de "padding" préalable, 3 autres algorithmes, d'autres dérivations
de sous-clefs, et la possibilité de tronquer le résultat, mais je
vous/m'en fait grâce.

Je ne connais pas d'attaque contre l'algorithme 4, mais il y a
une attaqque évidente contre les algorithmes 2 et 3 quand le nombre
de messages traités avec la même clé n'est plus très faible devant
2^32 et que les messages sont connus de l'adversaire: une collision
sur les MAC peut se produire et l'adversaire peut alors monter une
recherche exhaustive de K, puis de K'.


Autre technique pour optimiser le temps de calcul:
remplacer DES3 par DESX, défini par
EncX(K K' K", P) = K" XOR Enc(K, K' XOR P)
Voir: Joe Kilian and Phillip Rogaway:
How to protect DES against exhaustive key search
<http://www.cs.ucdavis.edu/~rogaway/papers/desx-abstract.html>

Ainsi on peut assurer chiffrement et intégrité avec "seulement"
2 DES par bloc. Il faut utiliser une clé différente pour le
chiffrement et l'intégrité, mais on peut les dériver toutes deux
d'une clé maîtresse commune.


François Grieu

Avatar
Francois Grieu
"Sylvain" dit:

le hash (ou hmac) n'est pas applicable
1) je n'ai pas la place de l'insérer dans ma trame d'échange


S'il y a déjà une place pour un MAC, rien n'empêche de tronquer
le résultat de HMAC à la taille disponible.

2) le code "chiffrant" s'exécute dans un DSP et le
code "déchiffrant" dans une carte à puce, je préfère limiter
les algos à porter


Si le DES est triple ET en soft du/des côtés qui manque(nt) de
temps, il est probable que la solution de mon autre post
(usage de DESX qui est presque 3 fois plus rapide) est la
meilleure solution. Mais dans/avec de nombreuses cartes
à puce et/ou DES en hardware, simple DES est à peine moins
couteux que triple DES.


François Grieu

Avatar
Francois Grieu
"Sylvain" dit:

le hash (ou hmac) n'est pas applicable
1) je n'ai pas la place de l'insérer dans ma trame d'échange


S'il y a déjà une place pour un MAC, rien n'empêche de tronquer
le résultat de HMAC à la taille disponible.

2) le code "chiffrant" s'exécute dans un DSP et le
code "déchiffrant" dans une carte à puce, je préfère limiter
les algos à porter (..)
le hmac exigerait de plus trop de mémoire (..)
je dispose d'un DES3 et un XOR(64bits) n'est pas un problème


Un MAC à base de DES(3) semble indiqué, sauf problème de temps
machine. Sur ce plan, si le DES est triple ET en soft du/des
côtés qui manque(nt) de temps, il est probable que lusage de DESX,
qui est presque 3 fois plus rapide que DES3, est la meilleure
solution. Voir la fin de de mon autre post


Mais dans/avec de nombreuses cartes à puce et/ou DES en hardware,
simple DES est à peine moins couteux que triple DES, et la pas
de miracle.


François Grieu

Avatar
Johann Dantant
"Sylvain" a écrit dans le message de
news:419136af$0$18539$
François, Johann, all,

merci pour vos réponses.

j'utilise actuellement (pour le chiffrement) un DES3-CBC avec un aléa
utilisé comme IV et comme "signature" en l'insérant à la fin du clair.

je n'ai réalisé que recemment que - comme expliqué par François - des
blocs

faux au milieu du chiffré donne un clair incorrect (et dans mon cas je ne
peux pas le savoir, ie pas d'hypothèse sur le clair) uniquement pour le(s)
bloc(s) invalide(s) et le suivant (car le XOR ne porte que sur un chiffré
et

le bloc suivant).
ce "défaut" me donne une "signature" finale juste mais un message
globalement faux (avec un risque de fournir des infos à l'attaquant si je
traite son message choisi).


Effectivement, je viens seulement de prendre conscience de cette propriété
"intéressante" du CBC qui ne propage pas les erreurs de bloc en bloc... Bon,
oublions donc ma précédente intervention, en tout cas c'est toujours aussi
intéressant de lire les réponses de François Grieu !


Une question corrolaire qui me vient à l'esprit dans ce contexte : une fois
le MAC calculé d'une manière ou d'une autre) est-il plus judicieux d'ajouter
ce MAC à la fin du clair et de le chiffrer avec lui, ou de ne pas toucher au
MAC et de l'ajouter tel quel à la fin du chiffré ? Peut-on apporter une
réponse générale à cette question, ou va-t-on trouver des
avantages/inconvénients différents selon les algorithme, les tailles de
message, etc ?


-- J.D.

Avatar
Francois Grieu
"Johann Dantant" dit:

est-il plus judicieux d'ajouter le MAC à la fin du clair et de
le chiffrer avec lui ou de ne pas toucher au MAC et de l'ajouter
tel quel à la fin du chiffré ?


Je passe. Enfin si la clé de chiffrement est distincte de celle
du MAC, moi ça me semble pratiquement équivalent.
Une variante amusante consisterais à utiliser le MAC comme vecteur
d'initialisation d'un chiffrement CBC, avec l'avantage que, sans
qu'il soit besoin d'aléa, tout changement au clair se propage sur
tout le chiffré (mais avec l'inconvénient inévitable de devoir
parcourir le clair 2 fois)

Un autre débat classique est entre mac puis chiffrement,
et chiffrement puis mac. Je passe aussi.
http://google.fr/search?q=mac-then-encrypt


François Grieu

1 2