Confidentialité
k k
| |
v v
------- -------
| | | |
m --> | E | --> c --> | D | --> m
| | | |
------- -------
Deux types d'attaques :
- brute-force : énumération des clés
- connaissances supplémentaires :
- a priori sur $m$ si l'attaque est chiffre seul
- acquises si on peut avoir ou produire des couples (message, chiffre)
On considère en 2024 que si le nombre de clés est supérieur $2^{128}$, l'approche brute-force n'est pas profitable car il faudrait un temps de déchiffrage supérieure à la durée de vie du message. Si l'on utilise des connaissances supplémentaires, il est possible de faire baisser ce nombre drastiquement.
Qu-est ce que la confidentialité ?
Le message ne doit pouvoir être lu que par son destinataire. Comment partager la clé en secret ?
Chiffrer un message
Les algorithmes de chiffrement classiques ne permettent pas de chiffrer des message de taille quelconque. Ils sont conçus pour chiffrer des blocs de taille fixes.
Chiffrer un message de taille fixe
Chiffrer un message de taille quelconque
Il existe historiquement deux types de codes même si les différences commencent à s'estomper entres eux :
- les codes en flux qui vont se comporter comme le code de Vernam
- les code en bloc qui vont découper le message en blocs et chiffrer chacun d'entre eux avec un permutation.
Attention aux implémentations
Les side channel attacks permettent, on l'a vue, de tirer parie de l'implémentation de l'algorithme pour obtenir un avantage npn négligeable. Pour qu'aucune information ne transparaisse, il faut que l'algorithme :
- fasse tout le temps la même chose
- consomme la même énergie
- ...
Bref, n'implémentez pas vous même les algorithmes, prenez des implémentations éprouvées.
Générer des clés
Générateur de nombre aléatoire cryptographique
TBD LSFR
Rapport de stage sur les codes LSFR : projet codes LSFR
Trouver la clé
Il faut utiliser des générateur avec entropie. Il n'est pas utile de retrouver le nombre ensuite.
TBD
/dev/random
ou/dev/urandom
TBD : faire grossir partie aléatoire
Key derivation function
Les protocole vont avoir besoin de tout un tas de clés différentes. Une pour chaque message à transmettre et pour chaque messages. La façon la plus simple, si on a un PRF sous la main est de :
- posséder une clé primaire appelée $SK$ (source key)
- une constante $CTX$, application dépendante pour éviter que plusieurs applications différentes utilisant la même clé primaires de se trouvent avec les mêmes clés
Puis il suffit d'étier le process à chaque fois que l'in veut une clé avec : $F(\text{SK}, \text{CTX} || i)$, où $i$ est un compteur.