Choisir le mode d'opération pour chiffrement par bloc
Sommaire
Dans cet article, je vous propose une aide pour choisir le mode d’opération pour chiffrement par bloc ou block cipher. L’objectif est de synthétiser les éléments essentiels pour savoir quel mode utiliser en prenant en compte des propriétés de sécurité mais aussi des critères de performance et notamment à l’aide d’un petit outil que j’ai développé pour ce besoin.
Introduction
La cryptographie et le chiffrement sont très répandus dans le monde numérique dans lequel nous vivons. A titre d’exemple, 85.8% des sites Web emploieraient désormais le standard de chiffrement Hypertext Transfer Protocol Secure (HTTPS) par défaut pour échanger des données. Dans ce contexte, de nombreux algorithmes existent et il est parfois difficile d’arriver à choisir lequel déployé, surtout lorsqu’on utilise des solutions propriétaires assez fermées. Un cas récurrent est celui du choix des modes d’opération de chiffrement par bloc. Nous allons d’abord voir brièvement ce qu’est la cryptographie et le chiffrement par bloc. Puis, nous examinerons les principales propriétés des modes d’opération associés et plus en détails ce que font ces modes. Nous terminerons par la comparaison de ces modes.
Cryptographie et chiffrement
La cryptographie est l’ensemble des techniques permettant de protéger des données afin d’assurer leur confidentialité (l’information ne peut être lue par une personne non autorisée), leur intégrité (l’information ne peut être modifiée par une personne non autorisée), leur authenticité (l’information est attribuée à son auteur légitime) ou leur non-répudiation (l’information ne peut faire l’objet d’un déni de la part de son auteur). Parmi les moyens pour la cryptographie, le chiffrement ou encryption permet d’assurer la confidentialité des données en utilisant un algorithme appelé chiffre ou cipher pour rendre les données incompréhensibles en produisant un chiffré ou ciphertext à l’aide d’une clé de chiffrement. Le déchiffement ou decryption effectue l’opération inverse, à savoir retrouver les données en clair ou plaintext à partir du ciphetext.
Le chiffrement est soit sous forme symétrique, où la même clé est utilisée pour chiffrer et déchiffrer les données, soit sous forme asymétrique, où une clé dîte publique (car partagée) est utilisée pour le chiffrement et une autre clé dîte privée (car maintenue secrète) est utilisée pour le déchiffrement. Le chiffrement symétrique est généralement plus performant que le chiffrement asymétrique mais la problématique du chiffrement symétrique réside dans le partage de la clé de chiffrement. C’est pourquoi les deux types cohabitent souvent ensemble, le chiffrement asymétrique étant utilisé pour chiffrer l’échange d’une clé de chiffrement symétrique utilisée pour chiffrer le reste des données à échanger.
Chiffrement par bloc et par flot
Il existe deux grandes familles de chiffrement symétrique : le chiffrement par bloc ou block cipher et le chiffrement par flot ou stream cipher. Le chiffrement par bloc consiste à découper le plaintext en blocs de taille généralement fixe, tandis que le chiffrement par flot consiste à traiter les données bit par bit sans les découper.
Il existe plusieurs algorithmes de chiffrement par bloc : Advanced Encryption Standard (AES), Data Encryption Standard (DES), 3DES, International Data Encryption Algorithm (IDEA), Blowfish, Twofish, RC5, etc. Le chiffrement par bloc propose de nombreux modes d’opération et il peut être difficile d’arriver à choisir quel mode utiliser, sachant qu’il faut déjà déterminer l’algorithme et aussi la longueur de la clé.
Propriétés principales des modes d’opération
Je vais ici expliquer les propriétés principales des modes d’opération afin que vous puissiez mieux comprendre ce qui les différencie concrètement.
Confidentiality Only et AEAD
Certains modes d’opération garantissent uniquement la confidentialité des données par chiffrement : on parle de Confidentiality Only. Certains modes d’opérations offrent également l’intégrité et l’authenticité des données par authentification : on parle alors de chiffrement authentifié ou Authenticated Encryption (AE). L’AE repose sur l’utilisation d’un Message Authentication Code (MAC), un code ou tag calculé à partir d’une clé de chiffrement et d’un algorithme. Le MAC est alors utilisé pour vérifier si les données ont été modifiées et confirmer qu’elles proviennent bien de l’émetteur de celles-ci. Dans le cadre de l’AE, le MAC est soit :
- calculé puis chiffré avec le plaintext pour produire le ciphertext (on parle de MAC-then-Encrypt ou MtE) ;
- calculé à partir du ciphertext qui est produit après chiffrement du plaintext (on parle de Encrypt-then-MAC ou EtM) ;
- calculé séparemment du ciphertext (on parle de Encrypt-and-MAC ou E&M).
Il existe aussi la possibilité de transmettre des données additionnelles en clair en plus des données chiffrées (le ciphertext) et d’authentifier, toujours avec un MAC, l’ensemble données additionnelles et ciphertext. On parle alors d’Authenticated Encryption with Associated Data (AEAD). Cela peut être utile si certaines données ne doivent pas être chiffrées lors de leur transmission mais qu’on souhaite tout de même faire dépendre l’intégrité de l’ensemble lors des vérifications d’intégrité à réception. Dans le cadre de l’AE, le MAC est calculé suivant différents modes (proches de MtE, EtM ou E&M) que nous allons découvrir par la suite.
Pour vous donner un exemple un peu plus concret, lorsqu’on réalise de l’AEAD via le mode Galois/Counter Mode (GCM) pour chiffrer et authentifier les données avec le protocole IPsec ESP, c’est le Security Parameter Index ou SPI (utilisé pour identifier des flux IPsec relatifs à des paramètres cryptographiques négociés) qui fait office de données additionnelles pour AEAD.
Padding
Le fait de découper les données en bloc contraint les modes d’opération à ajouter des données pour pouvoir réaliser les opérations logiques XOR (OU Exclusif) qui sont effectuées bit à bit. En effet, les éléments qui sont soumis au XOR doivent être de même taille. L’ajout de ces données s’appelle le rembourrage ou padding. Certains modes d’opération s’affranchissent de cela en générant une séquence de clé ou keystream qui peut être utilisé comme dans le chiffrement par flot bit-à-bit et chaque bloc n’a alors plus la contrainte d’avoir la même taille que l’élément auquel il est confronté pour être chiffré. Le chiffrement par bloc devient alors un chiffrement par flot, même si les données sont initialement découpées en bloc. Ceci est intéressant car le padding rallonge la taille du ciphertext par rapport au plaintext originel et a introduit des attaques comme l’attaque Padding Oracle.
Streamable
On dit qu’un chiffre est streamable (ou qu’il est un online cipher) s’il peut traiter un message bloc par bloc et délaisser les blocs déjà traités. Dans le cas contraire, tout le plaintext doit être stocké avant de démarrer le chiffrement. Une telle propriété permet d’effectuer la réception, stockage, chiffrement / déchiffrement et envoi de manière plus rapide.
Déterminisme ou probabilisme
Si le ciphertext produit selon le plaintext peut être le même pour chaque plaintext identique, on parle alors de déterminisme. Dans le cas où le ciphertext produit est différent pour chaque plaintext identique, on parle alors de probabilisme. Il est préférable d’avoir un mode d’opération probabiliste afin de résister à différentes attaques qui affaiblieraient la robustesse du chiffrement. Le probabilisme est généralement rendu possible dans le chiffrement par bloc avec l’introduction de données aléatoires, pseudo-aléatoires ou du moins imprédictibles, par l’utilisation de vecteur d’initialitation ou Initialization Vector ou IV (suite de bits qui doit être aléatoire ou pseudo-aléatoire) ou de nonce (un IV utilisé une seule fois, généralement aléatoire ou pseudo-aléatoire).
Accès en lecture aléatoire
L’accès en lecture aléatoire ou random read access est une propriété qui consiste à pouvoir déchiffrer un bloc de ciphertext de manière aléatoire sans avoir à déchiffrer d’autre blocs de ciphertext. Cela peut être intéressant pour obtenir de la flexibilité dans l’accès aux données, par exemple lorsqu’on veut déchiffrer certaines données d’un disque dur sans déchiffrer tout le disque !
Gestion de la propagation des erreurs
Une erreur sur un bit de ciphertext (par exemple lors de la transmission de ce dernier peut avoir un impact d’amplitude différente selon les modes d’opération. En effet, selon le niveau de dépendance des blocs de ciphertext entre eux, l’erreur peut alors se propager lors du déchiffrement. Il est à noter qu’avec l’AEAD, toute erreur sur un bit du ciphertext invalidera systématiquement le déchiffrement à cause de la vérification du MAC.
Parallélisme
Le parallélisme consiste ici à pouvoir réaliser de manière simultanée des opérations de chiffrement ou de déchiffrement sur des blocs indépendamment des autres blocs. Cela permet évidemment des gains de temps considérables rendant le mode d’opération plus performant.
Principaux modes d’opération
Je vous propose de comparer 10 modes d’opérations pour chiffrement par bloc. Notez qu’il existe d’autres modes que je ne décris pas ici. Je vous propose ici volontairement une description textuelle, des schémas étant très facilement trouvables sur le Web.
- Electronic Codebook (ECB) : chaque bloc de plaintext est associé à la clé de chiffrement via l’algorithme de chiffrement pour produire un bloc de ciphertext de manière indépendante des autres blocs.
- Cipher Block Chaining (CBC) : chaque bloc de plaintext est associé au bloc de ciphertext précédent via une opération XOR puis associé à la clé de chiffrement via l’algorithme de chiffrement pour produire un un bloc de ciphertext. Le premier bloc de plaintext est associé à un IV via une opération XOR.
- Cipher Feedback (CFB) : chaque bloc de ciphertext produit est associé à la clé de chiffrement via l’algorithme de chiffrement puis le résultat est associé au bloc de plaintext suivant via une opération XOR. Le premier bloc de plaintext est associé, via une opération XOR, au résultat de l’association de la clé de chiffrement et d’un IV via l’algorithme de chiffrement. CFB ne nécessite pas de padding et se transforme alors en chiffrement par flot.
- Output Feedback (OFB) : chaque bloc de ciphertext est produit par l’association du plaintext à une keystream créée à partir de l’association de la clé de chiffrement et d’un IV via l’algorithme de chiffrement. Le mode OFB transforme alors un chiffrement par bloc en chiffrement par flot.
- Counter (CTR) : chaque bloc de ciphertext est produit de manière indépendante des autres blocs par l’association du plaintext à une keystream. Cette keystream est créée à partir de l’association, via l’algorithme de chiffrement, de la clé de chiffrement et de la concaténation d’un nonce et d’un compteur qui est incrémenté pour chaque bloc. Le mode CTR transforme alors un chiffrement par bloc en chiffrement par flot.
- Counter with cipher block chaining message authentication code (CCM) : utilise le mode CTR pour le chiffrement par flot et le mode CBC-MAC (similaire au mode CBC pour le chiffrement par bloc) afin de produire un MAC pour l’authentification. CCM est un mode AE et plus précisemment un mode AEAD de type MtE.
- Galois/Counter Mode (GCM) : utilise le mode CTR (sauf que les compteurs sont associés initialement avec un IV) pour le chiffrement par flot. A cela est ajouté une variante Wegman-Carter pour produire un MAC : il s’agit d’une opération XOR entre le résultat de l’association de la première valeur du compteur et de la clé de chiffrement via l’algorithme de chiffrement et du résultat d’une fonction de hachage appelée GHASH. GHASH est une multiplication polynomiale à partir de données additionnelles et utilisant les blocs de ciphertext comme coefficients du polynôme, suivie d’une opération XOR avec la concaténation des valeurs de la longueur des données additionnelles et de celles du ciphertext. Disons plus simplement que GCM est donc un mode AE et plus précisemment un mode AEAD de type EtM.
- Encrypt-then-authenticate-then-translate (EAX) : utilise le mode CTR pour le chiffrement par flot et le mode One-key MAC (OMAC, similaire à CBC-MAC) afin de produire un MAC pour l’authentification. EAX est un mode AE et plus précisemment un mode AEAD de type EtM.
- Synthetic Initialization Vector (SIV) : produit un chiffrement par bloc et un MAC. Le MAC est produit via fonction pseudo-aléatoire ou pseudorandom function (PRF, ici en l’occurence CMAC-AES) à partir de la clé de chiffrement et du plaintext concaténé au nonce (ce qui permet d’utiliser le nonce deux fois). Le ciphertext est produit via un algorithme de chiffrement (ici en l’occurence AES-CTR) à partir du plaintext, d’une deuxième clé de chiffrement et du MAC. SIV est un mode AE et plus précisemment un mode AEAD de type MtE.
- Offset codebook (OCB) : chaque bloc de plaintext est d’abord associé à un offset (une valeur déterminée à partir de la clé de chiffrement et d’un nonce incrémenté pour chaque bloc) via une opération XOR. Ensuite, le résultat est associé à la clé de chiffrement via un algorithme de chiffrement puis le tout est de nouveau associé à l’offset via une opération XOR. Un MAC est produit pour l’authentification à partir des blocs de plaintext qui sont associés via une opération XOR, puis le résultat est associé à la clé de chiffrement via l’algorithme de chiffrement. OCB est un mode AE avec chiffrement par flot et sa version OCB2 est plus précisemment un mode AEAD avec chiffrement par flot.
Il peut ne pas être évident de choisir un de ces modes rien qu’à la lecture de leur fonctionnement. Comme vous l’avez sûrement perçu, chacun de ces modes d’opération, suivant leur conception, possède des propriétés différentes permettant des fonctionnalités de sécurité ou de meilleures performances. La suite de l’article vous aidera à y voir plus clair pour comparer ces modes et mieux pouvoir choisir.
Comparaison des modes d’opérations
Dans cette section, nous allons comparer les modes d’opération que nous avons décrit, d’abord vis-à-vis des propriétés principales, puis selon leurs peformances à l’aide d’un outil que j’ai développé.
Propriétés
Le tableau suivant synthétise les différentes propriétés des principaux modes d’opération de chiffrement par bloc.
ECB | CBC | CFB | OFB | CTR | CCM | GCM | EAX | SIV | OCB | |
---|---|---|---|---|---|---|---|---|---|---|
Mode | Confidentiality only | Confidentiality only | Confidentiality only | Confidentiality only | Confidentiality only | AEAD | AEAD | AEAD | AEAD | AEAD |
Padding nécessaire (pas de chiffrement par flot) | Oui | Oui | Non | Non | Non | Non | Non | Non | Non | Non |
Streamable | Oui | Oui | Oui | Oui | Oui | Non | Oui | Oui | Non | Oui |
Deterministe ou Probabiliste | Déterministe | Probabiliste | Probabiliste | Probabiliste | Probabiliste | Probabiliste | Probabiliste | Probabiliste | Probabiliste | Probabiliste |
Accès aléatoire possible | Oui | Oui | Oui | Non | Oui | Non | Oui (après vérification du MAC) | Oui (après vérification du MAC) | Oui (après vérification du MAC) | Oui |
Parallélisation possible | Chiffrement et déchiffrement | Déchiffrement seulement | Déchiffrement seulement | Non | Chiffrement et déchiffrement | Chiffrement et déchiffrement | Chiffrement et déchiffrement | Chiffrement et déchiffrement | Non | Chiffrement et déchiffrement |
Impact de la propagation des erreurs | Moyen car affectant le bloc courant entier | Important car affectant le bloc courant entier et les blocs suivants | Important car affectant le bloc courant entier et les blocs suivants | Faible car affectant seulement le bit concerné | Faible car affectant seulement le bit concerné | Important car invalidant le MAC | Important car invalidant le MAC | Important car invalidant le MAC | Important car invalidant le MAC | Important car invalidant le MAC |
Mesures des performances avec cryptauditor
Pour finir cet article, je vous propose de comparer les performances des modes d’opération avec un petit outil que j’ai développé pour ce besoin : cryptauditor. Cet outil utilise la librairie Python PyCryptodome pour permettre, selon une clé aléatoire de longueur donnée, le chiffrement et déchiffrement de données aléatoires avec l’algorithme de chiffrement AES en utilisant différents modes possibles ou bien avec l’algorithme de chiffrement Rivest–Shamir–Adleman (RSA). J’ai étendu les capacités de cryptauditor avec le support de plus de techniques cryptographiques comme les fonctions de hachage ou les algorithmes de signatures digitales.
Dans cryptauditor, pour mesurer le temps d’exécution de la fonction de chiffrement ou de déchiffrement, j’utilise la librairie Time et le compteur perf_counter(). Aussi, je désactive le garbage collector durant la mesure afin de perturber au minimum les résultats.
Voici un exemple d’utilisation de cryptauditor :
$ python3 cryptauditor.py -u us -r 100000 -d 10B -c AES-OFB
Performing 100000 rounds of AES encryption and decryption in OFB mode with a 256-bit random key on 10B of random data
Encryption time: 2.685us
Decryption time: 2.666us
Vous pouvez aussi vous amuser à tester tous les modes d’opération pour AES en une seule commande, cryptauditor vous affichera alors le classement en vitesse :
$ python3 cryptauditor.py -c aes-all -d 100MB -r 10 -u s
Performing 10 rounds of AES encryption and decryption in ECB mode with a 256-bit random key on 100MB of random data
Performing 10 rounds of AES encryption and decryption in CBC mode with a 256-bit random key on 100MB of random data
Performing 10 rounds of AES encryption and decryption in CFB mode with a 256-bit random key on 100MB of random data
Performing 10 rounds of AES encryption and decryption in OFB mode with a 256-bit random key on 100MB of random data
Performing 10 rounds of AES encryption and decryption in CTR mode with a 256-bit random key on 100MB of random data
Performing 10 rounds of AES encryption and decryption in CCM mode with a 256-bit random key on 100MB of random data
Performing 10 rounds of AES encryption and decryption in GCM mode with a 256-bit random key on 100MB of random data
Performing 10 rounds of AES encryption and decryption in EAX mode with a 256-bit random key on 100MB of random data
Performing 10 rounds of AES encryption and decryption in SIV mode with a 256-bit random key on 100MB of random data
Performing 10 rounds of AES encryption and decryption in OCB mode with a 256-bit random key on 100MB of random data
Encryption speed ranking:
1 - AES-ECB (+0.0s)
2 - AES-CTR (+0.109s)
3 - AES-CBC (+0.132s)
4 - AES-OFB (+0.151s)
5 - AES-OCB (+0.182s)
6 - AES-SIV (+0.342s)
7 - AES-EAX (+0.343s)
8 - AES-CCM (+0.345s)
9 - AES-GCM (+0.65s)
10 - AES-CFB (+2.523s)
Decryption speed ranking:
1 - AES-ECB (+0.0s)
2 - AES-CBC (+0.121s)
3 - AES-CTR (+0.13s)
4 - AES-OFB (+0.154s)
5 - AES-OCB (+0.333s)
6 - AES-SIV (+0.358s)
7 - AES-CCM (+0.363s)
8 - AES-EAX (+0.364s)
9 - AES-GCM (+0.669s)
10 - AES-CFB (+2.513s)
Je me permets au passage de vous recommander 2 autres outils alternatifs intéressants qui offrent des fonctionnalités similaires : CyberChef et openssl (avec l’option speed).
J’ai mesuré les performances des différents modes d’opération avec l’algorithme de chiffrement AES avec une clé de 256 bits et pour différentes tailles de données aléatoires comprises entre 1B et 100MB et en effectuant 10000, 100000 ou 1000000 d’exécutions (afin de faire une moyenne) selon la taille des données à traiter. Les mesures ont été effectuées sur un MacBook Pro avec processeur Intel Core i5 2,4 GHz Quad-Core avec 16 Go de mémoire et tournant sur macOS Catalina (version 10.15.7) au moment des tests. Je me suis amusé à ajouter RSA dans les tests, à titre de comparaison. Notez que RSA a une limite assez basse en termes de taille de plaintext pouvant être traité, à savoir la taille de la clé (modulus) moins le padding moins la taille de la sortie de l’empreinte de la fonction de hachage.
Les ordonnées (en échelle logarithmique pour plus de visibilité) sont le temps d’exécution en ms et les abscisses sont la taille des données à chiffrer ou déchiffrer en Bytes (B).
Place à un peu d’analyse… Mais avant tout, ici, je fais appel à votre bon scepticisme car beaucoup de paramètres peuvent faire varier les résultats et notamment le matériel sous-jaçent !
Une des premières choses que l’on constate c’est que les tendances évoluent à mesure que la taille des données à traiter augmente. Malgré tout, le mode le plus performant ici est ECB. Cela n’est pas une surprise car il est le mode le plus simple (mais aussi le moins sécurisé !), ne fait que de la Confidentiality Only et il est parallélisable. On constate aussi que les modes offrant de l’AEAD (CCM, GCM, EAX et SIV) sont naturellement plus long à exécuter que les autres, ce qui est normal car ils doivent exécuter du tratiement supplémentaire due à la fonction d’authentification. En particulier, on voit que SIV n’est pas performant pour des petites quantités des données puis qu’il rentre dans le rang à mesure que la taille données augmente. En outre, les modes OFB et CTR offrent des performances très intéressantes. Enfin, RSA se confirme très peu performant comparé à AES.
Je vous invite clairement à effectuer vos propres tests ainsi qu’à lire d’autres articles relatifs à ce genre d’étude (voir les sources en fin d’article).
Conclusion
Nous sommes mieux armés pour répondre à la question : quel mode d’opération choisir ? La réponse dépend cependant de bien des critères mais surtout de bonnes pratiques.
- Choisissez un mode probabiliste.
- Veillez particulièrement à utiliser des IV aléatoires et des nonces uniques.
- Etudiez le matériel sous-jaçent (y a-t-il un matériel dédié pour le chiffrement et déchiffrement tel qu’un Application-Specific Integrated Circuit ou ASIC ?).
- Préfèrez un mode parallélisable.
- Soyez vigilant si l’accès en lecture aléatoire est nécessaire.
- Optez pour un mode sans padding.
- Vérifiez si une fonction d’authentification des données est déjà assurée ou non dans votre cas d’usage, si non, préférez un mode AEAD.
- Avec les modes Confidentiality Only, préférez un mode avec faible impact de la propagation des erreurs.
De manière générale, les modes préconisés sont CTR, GCM et OCB.
Sources
- W3Techs - Usage statistics of Default protocol https for websites : https://w3techs.com/technologies/details/ce-httpsdefault. Consulté le 25/10/2022.
- Agence nationale de la sécurité des sytèmes d’information - Crypto Sensu : https://www.ssi.gouv.fr/particulier/bonnes-pratiques/crypto-le-webdoc/crypto-sensu/. Consulté le 25/10/2022.
- Jean-Philippe AUMASSON, Serious Cryptography - No Starch Press, 312 pages, 2017.
- IETF - RFC 4106 - The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating Security Payload (ESP) : https://datatracker.ietf.org/doc/html/rfc4106. Consulté le 25/10/2022.
- Wikipedia - Padding (cryptography) : https://en.wikipedia.org/wiki/Padding_(cryptography)#Byte_padding. Consulté le 25/10/2022.
- Wikipedia - Padding oracle attack : https://en.wikipedia.org/wiki/Padding_oracle_attack. Consulté le 25/10/2022.
- Google Images - AES modes of operations : https://en.wikipedia.org/wiki/Padding_oracle_attack. Consulté le 25/10/2022.
- Agence nationale de la sécurité des sytèmes d’information, Guide de séclection d’algorithmes cryptographiques, 58 pages, 2021.
- Wikipedia - Block cipher mode of operation : https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation. Consulté le 25/10/2022.
- Medium - Selecting the Best AES Block Cipher Mode (AES-GCM VS AES-CBC) : https://isuruka.medium.com/selecting-the-best-aes-block-cipher-mode-aes-gcm-vs-aes-cbc-ee3ebae173c. Consulté le 25/10/2022.
- S. Almuhammadi and I. Al-Hejri, A comparative analysis of AES common modes of operation, 2017 IEEE 30th Canadian Conference on Electrical and Computer Engineering (CCECE), 2017, pp. 1-4.
- Wellesley College - Computer Science Department - Fundations of Cryptography : Block ciphers And modes of operation - https://cs.wellesley.edu/~cs310/lectures/09_block_cipher_slides_handouts.pdf. Consulté le 25/10/2022.
- A. Jha, C. Mancillas-López, M. Nandi and S. Sen Gupta, On Random Read Access in OCB, in IEEE Transactions on Information Theory, vol. 65, no. 12, pp. 8325-8344, Dec. 2019.
- Svenda, P. Basic comparison of Modes for Authenticated-Encryption (IAPM, XCBC, OCB, CCM, EAX, CWC, GCM, PCFB, CS).
- S. Almuhammadi and I. Al-Hejri, A comparative analysis of AES common modes of operation, 2017 IEEE 30th Canadian Conference on Electrical and Computer Engineering (CCECE), 2017, pp. 1-4.
- GitHub - thibaut-probst - cryptauditor : https://github.com/thibaut-probst/cryptauditor. Consulté le 25/10/2022.
- Read the Docs - PyCryptodome documentation : https://pycryptodome.readthedocs.io/en/latest/. Consulté le 25/10/2022.
- Python 3.10.8 documentation - time - Time access and conversions : https://docs.python.org/3/library/time.html. Consulté le 25/10/2022.
- Python 3.10.8 documentation - time.perf_counter() : https://docs.python.org/3/library/time.html#time.perf_counter. Consulté le 25/10/2022.
- Python 3.10.8 documentation - gc — Garbage Collector interface : https://docs.python.org/3/library/gc.html. Consulté le 25/10/2022.
- CyberChef : https://gchq.github.io/CyberChef/. Consulté le 25/10/2022.
- OpenSSL - Cryptography and SSL/TLS Toolkit : https://www.openssl.org/. Consulté le 25/10/2022.
- IETF - RFC 8017 - PKCS #1: RSA Cryptography Specifications Version 2.2 - Encryption Operation : https://datatracker.ietf.org/doc/html/rfc8017#section-7.1.1. Consulté le 25/10/2022.