(LZMA est un algorithme de compression, pas cryptographique.)
Dans le but de implémenter des algorithmes cryptographiques, la méthode générique consiste à obtenir le standard descriptif pertinent, en saisissant votre clavier, et essayer. La plupart des standards incluent des "vecteurs de test", c'est-à-dire des exemples de valeurs qui vous permettent de savoir si votre implémentation renvoie les bonnes réponses. À ce stade, les choses diffèrent selon le type d'algorithme que vous envisagez.
Cryptographie symétrique:
Les algorithmes symétriques couvrent le cryptage symétrique, les fonctions de hachage, et les codes d'authentification de message (MAC). Vous n'avez pas besoin de connaître beaucoup de mathématiques pour les gérer; la plupart concernent des ajouts d'entiers 32 bits et 64 bits (c'est l'arithmétique modulaire, avec 232 ou 2 64 comme module) et des opérations au niveau du bit (XOR, AND ...).
Ce code est généralement fait en C. De bonnes performances sont obtenues en ayant quelques notions sur la façon dont le compilateur C comprendra et traduire le code en instructions pour le CPU; la connaissance de l'assemblage n'est pas strictement obligatoire, mais très utile. Un paramètre important est la mémoire cache: le déroulement en boucle est généralement un bon outil, mais si vous en faites trop, les performances diminuent fortement.
Je suggère de commencer par implémenter les fonctions de hachage classiques (la famille SHA, décrite dans FIPS 180-3) et en essayant de les rendre rapides. À titre de comparaison, obtenez OpenSSL et utilisez l'outil de ligne de commande openssl speed
pour voir quel type de performance peut être obtenu (cet outil est déjà inclus dans toute distribution Linux décente , et cela fonctionne aussi sur Windows et MacOS). Par exemple, sur mon PC:
$ openssl speed sha256Faire sha256 pendant 3s sur 16 blocs de taille: 4842590 sha256 en 3.00sFaire sha256 pour 3s sur 64 blocs de taille: 2820288 sha256 en 2.99sFaire sha256 pour 3s sur des blocs de 256 tailles: 1262067 sha256 en 2,99s Faire sha256 pendant 3s sur des blocs de 1024 tailles: 395563 sha256 en 3,00s
Faire sha256 pendant 3s sur 8192 blocs de taille: 53564 sha256 en 3,00sOpenSSL 0.9.8o 01 juin 2010 construit le: mercredi 23 février 00:47:27 UTC 2011options: bn (64,64) md2 (int) rc4 (ptr, char) des (idx, cisc, 16, int) aes (partiel) blowfish (ptr2) compilateur: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN-DHAVE_DLFCN_H -m64 -DL_ENDIAN -DLFCN_H -m64 -DL_ENDIAN -Dexter -Wall -DMD32_REG_T = int-DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM options de synchronisation disponibles: TIMES TIMEB HZ = 100 [valeur de type sysconf] fonction de synchronisation utilisée: 1000 fois par nombre de fois par octets. 64 octets 256 octets 1024 octets 8192 bytessha256 25827.15k 60367.37k 108056.57k 135018.84k 146265.43k
ce qui signifie qu'OpenSSL comprend une implémentation SHA-256 optimisée à la main dans l'assemblage, qui atteint 146 Mo / s lors du traitement de messages de 8 Ko. Sur la même machine, une implémentation en C pur devrait atteindre au moins 130 Mo / s.
Pour un exemple de la façon dont les fonctions de hachage sont implémentées en C et Java, et comment la vitesse de hachage peut être mesurée dans un manière significative, voir sphlib.
Ensuite, vous pouvez essayer le cryptage symétrique, en particulier l'AES ( FIPS 197). Cela aide un peu à savoir ce qu'est un champ fini de caractéristique 2, mais la norme est suffisamment claire pour vous guider à travers une implémentation superficielle. Ensuite, essayez d'optimiser les choses. OpenSSL peut servir de point de comparaison et s'inspirer des implémentations AES de Brian Gladman. En ce qui concerne la sécurité, il y a eu une certaine inquiétude quant aux informations dépendant de la clé qui pourraient être divulguées par l'utilisation de tables de recherche dans l'implémentation (essayez de rechercher «AES cache timing attack»); essayer de reproduire ce type d'attaque est un très bon exercice (attention, ce n'est pas facile, mais si vous réussissez à le démontrer en laboratoire, vous aurez beaucoup appris sur le fonctionnement des implémentations cryptographiques).
Cryptographie asymétrique:
La cryptographie asymétrique concerne les algorithmes qui impliquent plus d'une partie. Cela inclut le cryptage asymétrique (RSA, ElGamal), l'échange de clés (Diffie-Hellman) et les signatures numériques (RSA encore, DSA ...). Le contenu mathématique y est beaucoup plus vaste, et l'optimisation est un sujet beaucoup plus large que celui de la cryptographie symétrique, car il existe plusieurs façons d'implémenter chaque algorithme, au lieu d'un seul chemin d'implémentation "évident".
Une bonne référence est le Guide de la cryptographie par courbe elliptique. Bien qu'il s'agisse principalement de courbes elliptiques, il inclut un traitement général de la mise en œuvre d'opérations en champs finis, et il se trouve que c'est l'exemple de chapitre qui peut être téléchargé gratuitement à l'URL liée ci-dessus. Alors récupérez-le et lisez-le maintenant. Une autre référence indispensable est le Handbook of Applied Cryptography, qui peut être téléchargé gratuitement; le chapitre 14, en particulier, concerne une implémentation efficace.
RSA est assez simple et est correctement décrit dans PKCS # 1. Il existe des attaques de synchronisation possibles sur RSA, qui sont contrées par le masquage (oui, c'est un article "écrit par un chercheur", mais en matière de cryptographie, les chercheurs sont ceux qui comprennent ce qui se passe sur). Si vous maîtrisez l'arithmétique modulaire, vous pouvez essayer d'implémenter DSA ( FIPS 186-3). Diffie-Hellman est mathématiquement simple (il n'a besoin de rien de plus que nécessaire pour implémenter DSA) mais sa norme de description (ANSI X9.42) n'est pas téléchargeable gratuitement.
Les courbes elliptiques sont un futur remplaçant populaire pour modulaire arithmétique; Les variantes EC de DSA et Diffie-Hellman sont plus rapides et plus sûres avec des clés publiques plus courtes. Mais c'est plus des mathématiques. Là encore, le Guide to Elliptic Curve Cryptography est la référence incontournable.
Il existe d'autres types d'algorithmes de cryptographie asymétrique, par exemple le cryptosystème McEliece (chiffrement asymétrique; il existe une variante pour les signatures décrites par Niederreiter) et les algorithmes basés sur la réduction de réseau. Mais ils ne bénéficient pas (encore) des normes publiées qui prennent en charge les détails d'implémentation, et il n'y a pas tellement d'implémentations existantes avec lesquelles comparer. Vous feriez mieux de commencer par RSA et DSA.
Cryptanalyse:
La cryptanalyse utilise une dose beaucoup plus élevée de mathématiques que la mise en œuvre.
Pour la cryptographie symétrique, les deux principaux outils sont la cryptanalyse différentielle et linéaire; voir ce tutoriel.
Mon propre chemin vers la cryptographie a commencé par implémenter DES, puis par l'implémentation de la cryptanalyse linéaire de Matsui sur une version réduite de DES (8 tours au lieu de 16). DES est décrit dans la FIPS 46-3, qui est officiellement retirée, mais toujours disponible. De DES peut être défini Triple-DES (trois instances DES, avec trois clés distinctes, celle du milieu étant utilisée dans le sens "décryptage") et il existe des vecteurs de test publiés pour Triple-DES (également connu sous le nom de "TDES", "3DES", ou parfois "DES", ce qui est sans doute déroutant).
Pour les algorithmes asymétriques, la cryptanalyse implique principalement de travailler sur la structure mathématique des clés, par exemple en essayant de factoriser de gros entiers non premiers afin de casser les variantes RSA. Les mathématiques ici vont du non-trivial au totalement inimaginable, donc cela pourrait être une courbe d'apprentissage trop raide pour commencer la cryptographie en essayant de casser le RSA ...