jeudi 1 avril 2010

Combiner deux clés de manière sécurisée.

Dans le cadre d'une petite étude sur un PoC, je suis confronté au problème suivant.
Soit deux personnes, Alice et Bob, qui doivent accéder à des données. Alice a une clé, Bob a une clé. Mais Alice ou Bob pris seul ne doit pouvoir accéder aux données.

Dit autrement en des termes plus informatiques, j'ai une partition chiffrée via dm-crypt sous linux, et j'ai besoin de l'ouvrir avec deux clés. Chacune des clés prise séparément ne doit pas permettre l'ouverture de la partition. De plus chacune des clés ne doit pas faciliter l'attaque sur la partition chiffrée.

La première manière, simple, consiste à tout simplement concaténer les clés et les fournir à cryptsetup:
( echo -n $KEY_BOB$KEY_ALICE ) | cryptsetup luksOpen /dev/hda2 secret

Est il possible de faire mieux? Bien sûr. Deux méthodes donnent satisfaction.

1/ Il suffit d'utiliser le fameux chiffrement de Vernam .
Un XOR de la clé de Bob sur la clé d'Alice fournira une troisième clé permettant d'ouvrir la partition cryptsetup. Pour XOR-er facilement deux chaînes de caractères, un petit bout de code en C semble le plus efficace:
int main(int c, char **v) {
char *a, *b;
if (c != 3) return 1;
for(a = v[1], b = v[2]; *a && *b; a++, b++)
putchar(*a ^ *b);
putchar('\n');
return 0;
}

Par construction, ni la clé de Bob ni la clé d'Alice ne fournit la moindre information sur la 3e clé permettant de déchiffrer la partition.

2/ Une autre solution consiste simplement à faire un hash sécurisé des deux clés:
(echo -n $KEY_BOB$KEY_ALICE ) | sha256sum | ...
Il faut faire attention que la sortie de sha256sum est limitée aux caractères [0-9][a-f]; il faut donc la retraiter pour la retransformer en 32 octets avant de la passer à cryptsetup.

Vérifions rapidement ces résultats. 32 octets pour protéger la clé, est-ce suffisant? 32 octets, c'est 2^256 possibilités. En imaginant qu'une machine puisse tester 100000 clés par secondes, il faudra
2^256/(100000x3600x24x365)=3.67x10^64 années pour faire le calcul, ce qui semble acceptable.


Ces solutions passent facilement à l'échelle si l'on souhaite ajouter des clés. Avec deux, trois, quatre ou 'n' clés, cela fonctionne toujours. Toutefois, cela devient un problème lorsque l'ouverture requiert, mettons dix personnes, et que l'une d'elle n'est pas présente. Shamir a inventé un protocole permettant un fonctionnement par seuil, par exemple pouvoir obtenir la clé de déchiffrement lorsque seulement 'x' personnes sont présentes parmi les 'y' à détenir une partie de la clé. Bien que cela dépasse mon propos initial (je n'ai besoin que de deux clés), la solution est très intéressante.

Je remercie les participants du groupe fr.misc.cryptologie pour les bonnes idées.

Aucun commentaire:

Enregistrer un commentaire