C’est le premier post dans une partie 3 de la série sur les principes de base de la cryptographie. La série est décrite comme suit:
- chiffrement symétrique
- intégrité des données&chiffrement authentifié
- chiffrement asymétrique avec paires de clés publiques/privées
plonger dans le monde de l’informatique peut être une tâche ardue. Surtout seul!, Dans cette série de blogs, j’aimerais offrir un aperçu de haut niveau sur les bases de la cryptographie à ceux qui cherchent à approfondir le sujet et qui ne savent pas nécessairement par où commencer. Cet aperçu est basé spécifiquement sur mes principaux enseignements du cours de cryptographie I de Stanford enseigné par Dan Boneh, disponible sur Coursera.
j’ai décidé de suivre ce cours car je suis un développeur de blockchain qui ne venait pas d’un arrière-plan comp-sci traditionnel. J’ai étudié l’économie à l’université, mais je me suis davantage tourné vers la programmation informatique au début de ma carrière., Depuis que j’ai commencé à coder, je me suis donné pour mission de me rapprocher de l’ordinateur — d’éplucher les couches d’abstraction que j’aimais en tant que développeur web et de comprendre ce qui se passe sous le capot. La transition vers la crypto-monnaie et les systèmes distribués à partir du développement web a été un pas sauvage et merveilleux dans cette direction à bien des égards, notamment en se familiarisant avec les concepts de cryptographie. Cependant, je voulais une base plus solide., Comme c’est un domaine assez vaste, j’ai pensé que cela valait la peine de laisser tomber 70 $pour consommer ces informations dans un forum spécialement organisé par L’Université de Stanford. Vous pouvez également auditer ce cours sans remettre de devoirs gratuitement. Les merveilles de l’internet!
nous allons commencer.
Essentiellement, la cryptographie est la pratique de la communication sécurisée en présence de tiers éventuels adversaires. Le concept de communication sécurisée se compose de 2 points majeurs:
- sécurité contre les écoutes: cela garantit la confidentialité des données.,
- sécurité contre la manipulation des données: cela garantit l’intégrité des données, ce qui signifie que personne ne peut manipuler les données que vous avez envoyées et tromper le destinataire en acceptant les données manipulées comme valides.
la confidentialité des données est obtenue grâce au cryptage, qui peut prendre deux formes: symétrique et asymétrique.
- Le chiffrement symétrique utilise une seule clé qui doit être partagée entre tous les participants qui communiquent.
- Le chiffrement asymétrique utilise des clés personnelles., Chaque participant dispose de sa propre Clé publique et de sa propre paire de clés privées pour chiffrer et déchiffrer les messages lors de la communication.
(Remarque: Cet article traite de la cryptographie dans le contexte du chiffrement symétrique. Dans un post de suivi, nous allons plonger dans le cryptage asymétrique.)
cryptage des données: deux types de chiffrements
Le cryptage assure la confidentialité des données et implique deux composants importants:
- Une clé secrète: dans le contexte du cryptage symétrique, nous pouvons supposer que nos participants, Alice et Bob, ont une clé secrète partagée.,
- un chiffrement: un ensemble d’Algorithmes, un pour le chiffrement et un pour le déchiffrement.
il est important de noter que les algorithmes de chiffrement et de déchiffrement sont connus du public. La seule chose gardée secrète est la clé.
deux types de chiffrements sont les chiffrements de flux et les chiffrements de bloc. Une condition préalable potentielle pour bien comprendre ces deux chiffrements est la connaissance des opérations au niveau du BIT (opérations effectuées sur des bits). Plus précisément, le concept d’exclusif-ou (XOR). J’ai trouvé ce blogpost pour donner une explication très claire des opérations au niveau du BIT., Ou vous pouvez essayer de comprendre le concept de XOR en utilisant l’image ci-dessous. Fondamentalement deux bits sont combinés et si elles sont différentes (un 0 et un 1) elles résultent en 1, et si elles sont les mêmes, (les deux 0 ou deux 1) ils résultat de 0. À partir de là, je suppose que le lecteur comprend le concept de XOR et que la notation universelle pour XOR est:
Stream Cipher
un stream cipher est un chiffrement de clé symétrique où le texte en clair (sous forme d’octets) est XOR’d bit par bit avec la clé (également sous forme d’octets) pour produire, Le même processus est utilisé pour déchiffrer le texte chiffré. Étant donné la nature de L’opération XOR, si nous XORONS le texte chiffré avec la clé, cela revient avec le texte en clair d’origine.
Un lecteur attentif pourrait réaliser à partir de cette description que la clé (marqué dans l’illustration ci-dessus comme « Chiffrement de flux”) et clair doit avoir quelque chose de très important en commun. C’est le droit! La clé et le texte en clair doivent avoir la même longueur., Bien sûr, ce n’est pas extrêmement pratique.
pour rendre un chiffrement de flux plus pratique, l’idée d’un générateur de pseudorandomes est introduite. Un générateur de pseudorandomes est une procédure déterministe qui prend une entrée et produit un résultat de pseudorandomes encore plus long. Être une procédure déterministe signifie qu’elle retournera toujours la même sortie exacte si on lui donne la même entrée (c’est-à-dire que « abc123” entraîne « 8474f24e0d72e1b949ffd2 every” à chaque fois)., Le mot pseudorandom signifie que bien que la sortie ne soit pas réellement aléatoire (car elle est déterminée en fonction d’une entrée particulière), elle est en fait indiscernable d’une chaîne vraiment aléatoire. En d’autres termes, étant donné un échantillon d’entrées et de sorties, il n’y a aucun indice quant à la sortie correspondant à une entrée particulière et vice versa, il s’agit donc d’un pseudorandome. Il est possible d’utiliser la clé secrète partagée comme entrée pour produire une clé pseudo-aléatoire encore plus longue pour agir comme la clé longue à XORER avec le texte en clair tout aussi long.,
cette implémentation spécifique d’un chiffrement de flux que nous avons illustré jusqu’à présent s’appelle le « one-time-pad”. Une caractéristique extrêmement importante du one-time-pad est que la touche one-time-pad ne peut être utilisée qu’une seule fois. Une fois qu’il est utilisé une deuxième fois, la sécurité de ces messages est compromise.
illustré ci-dessous est une diapositive du cours. PRG (K) désigne la séquence pseudo-aléatoire générée à partir de notre clé partagée K. Le symbole denotes désigne XOR. c désigne le texte chiffré. m désigne un message (ou un texte en clair).,
en gros, cette diapositive est dire qu’une fois que la clé est utilisée deux fois, nous pouvons XOR le chiffrés ensemble, et c’est exactement égale à XOR avec les deux plaintexts ensemble. Comme il y a suffisamment de redondance en anglais, un attaquant averti peut utiliser ces informations pour récupérer complètement les messages.
pour maintenir une clé secrète partagée, le concept de nonce peut être utilisé pour s’assurer que nous ne répétons jamais la clé à une seule fois., Un nonce est un nombre arbitraire qui peut être utilisé une seule fois dans une communication cryptographique. Lors de l’envoi du texte chiffré, l’expéditeur peut également envoyer un nonce à combiner avec la clé secrète pour ensuite l’utiliser comme entrée pour produire une clé pseudo-aléatoire distincte pour chaque cryptage.
(Vous avez peut-être remarqué que la diapositive ci-dessus indique Attack 1., En aparté, pour ceux qui se demandent ce Qu’est Attack 2, Attack 2 est le fait que si stream cipher offre la confidentialité des données, il ne fournit pas l’intégrité des données comme défini dans la première section)
block Cipher
le deuxième type de chiffrement est un chiffrement par bloc. Un chiffrement par bloc prend une entrée de longueur fixe et chiffre itérativement le texte en clair encore et encore en utilisant une clé différente (une « clé ronde”) pour chaque tour et génère finalement un texte chiffré de la même longueur. 3DES et AES sont deux exemples de chiffrements de blocs qui prennent une entrée de 48 bits et 128 bits respectivement.,
La diapositive ci-dessus montre l’architecture de base d’un algorithme de chiffrement par bloc. Vous pouvez voir qu’un mécanisme d’extension de clé est utilisé pour avoir une nouvelle clé pour chaque tour. Le texte en clair, noté (m) pour message, est chiffré encore et encore jusqu’à ce que finalement le texte chiffré correspondant (c) de la même longueur soit renvoyé.
Par souci de brièveté, je vais couvrir AES dans cet article de blog., Bien que DES / 3DES soit historiquement significatif, AES est aujourd’hui plus largement utilisé et accepté.
AES est construit comme une Substitution Permutation Réseau. AES fonctionne sur un bloc de 128 bits, égal à 16 octets. Comme illustré ci-dessus en haut à gauche, nous écrivons les 16 octets comme une matrice 4 par 4. Cette matrice Sert de structure de données pour mélanger les données., Dans chaque tour, le processus est le suivant:
- On XOR la clé ronde, d’abord (k0), avec le message courant
- puis on passe par un processus de substitution où des blocs de données sont remplacés par d’autres blocs basés sur une table de substitution donnée (photo ci-dessus (1) ByteSub).
- nous passons par une couche de permutation où les bits sont permutés et mélangés (photo ci-dessus (2) ShiftRow & (3) MixColumn).
- ensuite, nous répétons ce processus pendant 10 tours.,
sur la photo ci-dessus, vous remarquerez que le dernier tour ignore l’étape de la colonne de mélange, XOR est le résultat avec notre clé de tour final et génère notre texte chiffré résultant. Afin de décrypter, nous inversons simplement le processus. Le cours offre un aperçu de haut niveau de ce processus de cryptage et encourage les étudiants à approfondir s’il vous intéresse. Par conséquent, je vais laisser le fonctionnement interne AES à cela. Je recommanderais aux gens de regarder dans la procédure de réseau Fiestel de 3DES pour une comparaison amusante et le contraste des différents chiffrements de blocs.,
en termes de matériel, depuis le lancement D’Intel Westmere, Intel a conçu ses processeurs avec des instructions spéciales pour l’optimisation AES intégrées directement dans leur matériel et AMD a emboîté le pas peu de temps après.
modes de fonctionnement du chiffrement par bloc
contrairement à un chiffrement par Flux, un chiffrement par bloc ne prend qu’une entrée de longueur fixe. Évidemment, nous voulons gérer des données supérieures à 16 octets à la fois. Ensuite, il est important de comprendre les modes de fonctionnement dans lesquels nous pouvons utiliser des chiffrements par blocs pour chiffrer de grands ensembles de données., Pour appliquer ce chiffrement par bloc à un grand ensemble de données, le premier mode de fonctionnement qui peut venir à l’esprit est appelé « Livre de codes électronique” (ECB). ECB divise simplement les données en blocs de 16 octets et effectue un cryptage AES uniformément. Il pourrait même être fait en parallèle. Très vite! Mais c’est effectivement pas très sûr.
Il est en danger parce que si un 16 octets du message se répète, le texte chiffré aura également répété de données., Cela divulgue des informations sur nos données à un attaquant potentiel. Nous pouvons appliquer cette vulnérabilité au cas où nous chiffrons une image avec ECB. Comme vous pouvez le voir ci-dessous, il est clair que notre image est un headshot. Dans la zone fortement noire, on peut voir une silhouette via les cheveux foncés et la chemise.
Il est important que nos systèmes de cryptage sont sémantiquement sûr., La sécurité sémantique est le concept selon lequel si nous avons un texte chiffré qui correspond à l’un des deux textes en clair différents, un adversaire ne peut pas deviner avec une meilleure probabilité que 1/2 à quel texte en clair correspond le texte chiffré. De toute évidence, la BCE n’est pas sémantiquement sûre. Notre image cryptée nous donne beaucoup d’informations pour deviner son image ordinaire correspondante.
ECB est un exemple de mode de fonctionnement à touche unique (ce qui signifie, Comme le pavé unique, qu’une touche ne peut être utilisée qu’une seule fois). Un autre mode de fonctionnement à clé unique plus sécurisé est le mode compteur déterministe. Vous êtes libre de le regarder par vous-même., Je vais passer aux modes de fonctionnement sécurisés qui permettent de nombreuses clés!
le chaînage de blocs de chiffrement (CBC) est un mode de fonctionnement qui enchaîne chaque bloc de 16 octets de texte brut ensemble en XOR’ing le texte chiffré du texte brut précédent dans notre texte brut actuel avant d’effectuer le chiffrement par bloc (C’est-à-dire AES). L’image ci-dessous précise de ce concept:
Nous avons d’abord commencer avec un hasard IV., IV signifie vecteur d’initialisation qui peut être défini comme: la valeur initiale utilisée pour démarrer un processus itéré. Dans le cas de CBC, L’IV doit être aléatoire (donc imprévisible), donc elle doit être unique pour chaque transaction. Le premier bloc du texte chiffré est simplement le Random IV non chiffré. pour produire le reste du texte chiffré, d’abord, le Random IV est XOR’d avec le premier bloc de texte brut (m). Le résultat est ensuite chiffré avec la clé ronde k pour renvoyer le premier bloc de texte chiffré chiffré (c)., Ce texte chiffré obtient ensuite XOR’d avec le bloc suivant de texte brut (m), le résultat est chiffré avec la clé ronde k et renvoie le deuxième bloc de texte chiffré chiffré (c). Le processus est poursuivi jusqu’à ce que tous les blocs aient été chiffrés.
À déchiffrer, nous avons juste inverser le processus.
un élément important du chiffrement CBC est que l’IV aléatoire est imprévisible., Si L’IV devient prévisible, notre système de cryptage devient vulnérable aux attaques en texte clair choisies. L’attaque en texte clair choisie (CPA) est un modèle d’attaque qui suppose que l’attaquant peut obtenir des textes chiffrés pour des textes en clair arbitraires et les utiliser pour révéler des informations sur des messages chiffrés. Par conséquent, une IV imprévisible est nécessaire pour assurer la sécurité de L’ACP.
supportez-moi ici alors que j’essaie d’expliquer comment cette attaque fonctionnerait: il est possible d’effectuer une attaque en texte clair choisie en présence de IV prévisibles en raison de la nature de XOR., Si vous XOR la même valeur ensemble (0101 ⊕ 0101) il sera toujours égal à 0, donc il s’annule. Donc, si vous soupçonnez qu’un texte chiffré observé c correspond à un texte en clair particulier m, vous pouvez tester votre hypothèse avec un IV prévisible. si le texte en clair en question a été chiffré avec IV1 tel que c = E(k, m IV IV1), vous pouvez soumettre un nouveau texte en clair à chiffrer et voir si vous obtenez un résultat correspondant: C. puisque vous pouvez prédire que le IV sera IV2, vous soumettez m IV IV1 IV IV2. , Le processus CBC XOR cette entrée avec le prochain IV, IV2 tel que: c = E(k, M IV IV1 IV IV2 IV IV2) donc IV2 s’annule, et encore une fois nous chiffrons E (k, IV1 m m) ce qui résulterait une fois de plus avec c et si cela se produit, nous avons pu deviner ce qui était précédemment chiffré avec IV1.
travail vraiment génial si vous avez traversé cela — ^
avec cela, je voudrais passer en revue un autre mode de fonctionnement du chiffrement par bloc qui conclura le premier article de blog de cette série de 3 parties. Si cela a été un gros effort pour se rendre aussi loin, maintenant pourrait être un bon moment pour une pause rapide avant de continuer!,
Ok, nous avons donc examiné ECB, CBC et leurs vulnérabilités, mais enfin, et probablement le plus important, je vais introduire le mode de compteur randomisé (CTR). Il s’agit du mode de fonctionnement le plus récent et le plus sécurisé, et il est également plus efficace que CBC.
Randomisés en Mode Compteur prend également aléatoire IV. Le IV sert un but différent ici. Notre clé est combinée (par exemple, via AES) avec une version itérée de notre IV: ci-dessus, nous continuons à ajouter 1 à notre IV pour chaque itération, sinon nous obtiendrions un résultat répété. Nous faisons cela jusqu’à ce que nous ayons un pad aussi longtemps que notre message en clair. Tout comme le chiffrement de flux de pad unique, nous XOR maintenant notre message en clair avec notre pad pseudorandom pour aboutir à un texte chiffré. Si votre matériel dispose de plusieurs moteurs AES, c’est ultra efficace car il est parallélisable. Dans CBC, chaque texte chiffré dépendait du bloc de texte chiffré précédent, il était donc impossible de paralléliser.,
nous n’avons même pas nécessairement besoin d’un chiffrement par bloc pour combiner notre IV et notre clé dans un pad pseudo-aléatoire. Les chiffrements de bloc doivent être réversibles. Si vous regardez de près la mécanique du mode compteur randomisé, vous remarquerez que le décryptage ne nous oblige pas à inverser F(k, IV)
. Étant donné la nature de XOR, tout ce que nous devons faire est de régénérer le même pad pseudorandom et de le XOR avec notre texte chiffré. Par conséquent, pour déchiffrer, nous devons répéter l’opération, pas l’Inverser.,
abstraitement parlant (jusqu’à présent, j’ai évité les concepts abstraits), cela signifie que la procédure que nous utilisons pour combiner notre clé secrète et IVF(k, IV)
doit être une fonction pseudo-aléatoire (PRF) par opposition à une Permutation pseudo-aléatoire (PRP). Nous avons effectivement appliqué ces concepts tout au long de cet article de blog. Les PRP et les PRF sont des procédures déterministes qui, étant donné une entrée particulière, entraînent une sortie pseudo-aléatoire. (C’est-à-dire AES, XOR). Cependant, un PRP est plus strict dans le sens où il doit être réversible., En fait, les Termes PRP et block cipher (comme AES) sont souvent utilisés de manière synonymique. Un PRF n’a cependant pas besoin d’être réversible. Si vous revenez aux diapositives précédentes affichées dans cet article, vous comprendrez maintenant la notation PRF et PRP.
qui conclut mon aperçu du chiffrement symétrique! Nous avons couvert les chiffrements de flux et les chiffrements de bloc. Ensuite, comme les chiffrements par blocs ne peuvent être effectués que sur environ 16 octets à la fois, nous avons couvert les modes de fonctionnement utilisés pour effectuer des chiffrements par blocs sur de grands plaintexts. Nous avons également clarifié les concepts de PRP vs PRF.