OVH Cloud OVH Cloud

Permettre le déchiffrement d'une portion de fichier (AES CTR ?)

6 réponses
Avatar
machin
Je voudrais chiffrer des fichiers en utilisant une méthode me permettant de
déchiffrer ensuite une partie quelconque de celui-ci (mes fichiers sont
structurés en "enregistrements")

Actuellement, j'utilise AS-CBC : si j'ai bien compris le sens de CBC, le
chiffrement d'un bloc dépend du bloc précédent, celui-ci ne permet que le
déchiffrement global du fichier.

Dans mon cas, je voudrais pouvoir faire des accès aléatoire sur le fichier
sans tout le déchiffrer (la taille de la fenêtre de déchiffrement devant
être alignée sur la taille d'un bloc, soit 128 bits pour l'AES)
AES-CTR semble être mon ami ...

Est ce que la méthode CTR est LA solution pour la lecture aléatoire ? Existe
t il d'autres alternatives ?

merci d'avance

6 réponses

Avatar
Francois Grieu
"machin" écrit:

Je voudrais chiffrer des fichiers en utilisant une méthode me
permettant de déchiffrer ensuite une partie quelconque de celui-ci
(mes fichiers sont structurés en "enregistrements")

Actuellement, j'utilise AES-CBC : si j'ai bien compris le sens de
CBC, le chiffrement d'un bloc dépend du bloc précédent, celui-ci
ne permet que le déchiffrement global du fichier.


Non. AES-CBC permet le déchiffrement à partir d'un bloc quelconque;
le seul problème est qu'il faut lire le bloc (de 128 bits) qui précède
la bloc à déchiffrer. En effet, pour déchiffrer le bloc n, on fait:
Pj = AES_Dec(K,Cj) XOR C{j-1}

Par contre AES-CBC ne permet pas de chiffrer à partir d'un point
quelconque; si il faut mettre à jour un bloc du fichier, il faut
déchiffrer et rechiffrer tout ce qui suit. Pas pratique pour une
base de donnée, ni un (volume virtuel sur) disque dur.

Attention AES-CTR semble résoudre le second problème, mais c'est un
leure: un adversaire qui connais la version précédente du clair,
et les deux versiosn du chiffré, en déduit par deux XOR la nouvelle
version du clair.

Si on désire une sécurité optimale, et une mise à jour facile, on peut
faire un chiffrement ECB mais avec une clé diversifiée par l'adresse
Cj = AES_Enc(AES_Enc(K,j),Pj)
Pj = AES_Dec(AES_Enc(K,j),Cj)
Ceci au prix, évidemment, d'un doublement du coût de calcul.


François Grieu

Avatar
Francois Grieu
"machin" écrit:

Je voudrais chiffrer des fichiers en utilisant une méthode me
permettant de déchiffrer ensuite une partie quelconque de celui-ci
(mes fichiers sont structurés en "enregistrements")

Actuellement, j'utilise AES-CBC : si j'ai bien compris le sens de
CBC, le chiffrement d'un bloc dépend du bloc précédent, celui-ci
ne permet que le déchiffrement global du fichier.


Non. AES-CBC permet le déchiffrement à partir d'un bloc quelconque;
le seul problème est qu'il faut lire le bloc (de 128 bits) qui précède
la bloc à déchiffrer. En effet, pour déchiffrer le bloc n, on fait:
Pj = AES_Dec(K,Cj) XOR C{j-1} avec le convention C{-1} = IV,
souvent IV=0.

Par contre AES-CBC ne permet pas de chiffrer à partir d'un point
quelconque; si il faut mettre à jour un bloc du fichier, il faut
déchiffrer et rechiffrer tout ce qui suit. Pas pratique pour une
base de donnée, ni un (volume virtuel sur) disque dur.

Attention AES-CTR semble résoudre le second problème, mais c'est un
leure: un adversaire qui connais la version précédente du clair,
et les deux versions du chiffré, en déduit par deux XOR la nouvelle
version du clair.

Si on désire résoudre ce problème, et une mise à jour facile,
on peut faire un chiffrement ECB mais avec une clé diversifiée par
l'adresse
Cj = AES_Enc(AES_Enc(K,j),Pj)
Pj = AES_Dec(AES_Enc(K,j),Cj)
Ceci au prix, évidemment, d'un doublement du coût de calcul.

Attention l'adversaire qui connais les chiffrés peut encore savoir
que tel ou tel bloc n'a pas été modifié. On peut ramener cette
granularité au niveau d'enregistrements de plusieurs blocs (par
exemple en chiffrant chaque enregistrement en CBC sur deux passes);
masquer à l'adversaire quel bloc a été réellement modifié (par
exemple en chiffrant l'adresse); et si une réécriture de donnéee
chiffrées différentes correspond, ou pas, à des données en clair
différentes (par exemple en incluant dans le clair un compteur
d'écriture).
On peut aussi assurer une certaine intégrité; mais ce n'est pas
simple, une base de donnée sécurisée contre un adversaire ayant
accès en lecture-écriture aux fichiers de la base. Et en tout
cas, l'adversaire peut ramener la base à un état antérieur.


François Grieu

Avatar
machin
"Francois Grieu" wrote in message
news:
Attention AES-CTR semble résoudre le second problème, mais c'est un
leure: un adversaire qui connais la version précédente du clair,
et les deux versions du chiffré, en déduit par deux XOR la nouvelle
version du clair.

Si on désire une sécurité optimale, et une mise à jour facile, on peut
faire un chiffrement ECB mais avec une clé diversifiée par l'adresse
Cj = AES_Enc(AES_Enc(K,j),Pj)
Pj = AES_Dec(AES_Enc(K,j),Cj)
Ceci au prix, évidemment, d'un doublement du coût de calcul.


Pourriez vous m'éclairer sur la signification des variables Cj, K, j, Pj



François Grieu


Avatar
Ludovic FLAMENT
Bonjour,

Actuellement, j'utilise AS-CBC : si j'ai bien compris le sens de CBC, le
chiffrement d'un bloc dépend du bloc précédent, celui-ci ne permet que le
déchiffrement global du fichier.


Oui et non. Le CBC implique effectivement qu'un bloc i dépend du bloc
i-1 mais cela n'oblige nullement le déchiffrement global.

Le déchiffrement en mode CBC s'effectue de la manière suivante :
Pi = Dk(Ci) xor Ci-1

Pour obtenir le bloc déchiffré (Pi), il suffit de connaître :
- le bloc chiffré (Ci)
- le bloc chiffré précédent (Ci-1)
- la clef de déchiffrement (k)

Vous pouvez constater cela, par exemple en chiffrant un fichier avec un
IV (iv1) et ensuite déchiffrer avec un autre IV (iv2). Vous constaterez
que le fichier est correct à l'exception des 128 premiers bits, dans la
mesure où vous avez donné un mauvais IV. Mais l'erreur ne se propage
pas, puisque le second IV utilisé lors du déchiffrement est le premier
bloc chiffré qui est bon et ainsi de suite.

Dans mon cas, je voudrais pouvoir faire des accès aléatoire sur le fichier
sans tout le déchiffrer (la taille de la fenêtre de déchiffrement devant
être alignée sur la taille d'un bloc, soit 128 bits pour l'AES)
AES-CTR semble être mon ami ...


Le mode counter, peut également être utilisé mais n'apporte rien de
plus que le CBC (voir il sera plus difficile) dans votre cas.

En effet le mode CTR utilise un IV (appelé nonce) et un compteur. Pour
déchiffré le bloc i, il vous faudra connaître la valeur initiale de l'IV
et la valeur du compteur pour le bloc courant ("valeur de départ du
compteur + i - 1" en théorie).

Il vous faut donc garder deux valeurs en CTR, alors qu'une seule est
nécessaire en CBC. Le mode CTR à des avantages sur le mode CBC, mais pas
forcément dans le cadre de votre utilisation.

Cordialement,
--
Ludovic FLAMENT
http://ludovic.flament.free.fr


Avatar
Francois Grieu
"machin" demande:

"Francois Grieu" wrote
Si on désire résoudre ce problème, et une mise à jour facile,
on peut faire un chiffrement ECB mais avec une clé diversifiée par
l'adresse
Cj = AES_Enc(AES_Enc(K,j),Pj)
Pj = AES_Dec(AES_Enc(K,j),Cj)
Ceci au prix, évidemment, d'un doublement du coût de calcul.


Pourriez vous m'éclairer sur la signification des variables
Cj, K, j, Pj


j = indice d'un bloc, base 0 (étendu à gauche par
des bits à 0 pour faire 128 bits)

Cj = bloc de 128 bits de "Ciphertext" (chiffré), à l'indice j
(cad à l'offset j*16 octets) dans le fichier chiffré

Pj = bloc de 128 bits de "Plaintext" (clair), à l'indice j
dans les données utiles

K = clé secrète, sur 128 bits

Y = AES_Enc(K,X) chiffrement AES d'un bloc X de 128 bits avec
la clé K de 128 bits, donnant Y de 128 bits

X = AES_Dec(K,Y) opération réciproque



François Grieu


Avatar
machin
"Francois Grieu" wrote
Si on désire résoudre ce problème, et une mise à jour facile,
on peut faire un chiffrement ECB mais avec une clé diversifiée par
l'adresse
Cj = AES_Enc(AES_Enc(K,j),Pj)
Pj = AES_Dec(AES_Enc(K,j),Cj)
Ceci au prix, évidemment, d'un doublement du coût de calcul.


Pourriez vous m'éclairer sur la signification des variables
Cj, K, j, Pj


j = indice d'un bloc, base 0 (étendu à gauche par
des bits à 0 pour faire 128 bits)

Cj = bloc de 128 bits de "Ciphertext" (chiffré), à l'indice j
(cad à l'offset j*16 octets) dans le fichier chiffré

Pj = bloc de 128 bits de "Plaintext" (clair), à l'indice j
dans les données utiles

K = clé secrète, sur 128 bits

Y = AES_Enc(K,X) chiffrement AES d'un bloc X de 128 bits avec
la clé K de 128 bits, donnant Y de 128 bits

X = AES_Dec(K,Y) opération réciproque



François Grieu


merci pour les précisions