Je ne suis pas si mauvais en mathématiques:
Je sais ce que sont les p-list et les p-combinaisons, je connais l'algèbre matricielle, je sais ce qu'est un XOR est, je sais comment dire si le nombre est un nombre premier, etc: je ne suis pas le programmeur qui déteste les mathématiques parce qu'il est mauvais dans ce domaine, mais je n'ai pas de doctorat de toute façon.
Je ne suis pas mauvais non plus en informatique, enfin du moins en termes de culture informatique générale:
Je connais C, C++ (tous deux appris à l'école), python, certains haskell, quel encodage de texte existe, comment UNICODE fonctionne, je sais comment un fichier peut être compressé ou chiffré, quels algorithmes communs existent (diffie-hellman, l'algorithme LZMA, DES, AES, Serpent, Blowfish, SHA, MD5 ...). Je me suis beaucoup intéressé à la cryptographie sur wikipedia ou sur d'autres sites Web, mais je ne pense pas que wikipedia puisse m'apprendre la cryptographie sans détailler les algorithmes ou sans pratiquer; par exemple, je sais ce qu'est la cryptographie synchrone et ce qui est asynchrone (clé publique/privée).
Je voudrais savoir comment implémenter correctement et en toute sécurité les algorithmes les plus populaires, et comment les rendre fiables: un livre ou de bons tutoriels ou cours. J'ai rapidement cherché sur Khan Academy, mais ce sujet n'est pas anodin et nécessite à la fois des connaissances en mathématiques, en informatique et/ou en électronique.
Je ne veux pas lire des pages et des pages de théorie seulement sur les choses de base que je connais déjà ou qui pourraient ne pas être vraiment pertinentes pour la cryptographie d'aujourd'hui, comme un article écrit par un chercheur, juste quelque chose de pratique, avec des problèmes et des problèmes de cryptanalyse, pour les étudiants.
J'ai actuellement beaucoup de temps libre, je n'ai que 26 ans, et je suis sûr que je peux apprendre ce truc, non seulement pour l'augmentation de salaire qu'elle peut m'apporter mais aussi parce que j'ai toujours été fasciné par la cryptographie sans vraiment la comprendre, Je ne trouve juste aucun bon matériel.
(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 la norme descriptive appropriée, à saisir votre clavier et à essayer. La plupart des normes 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 chiffrement symétrique, les fonctions de hachage et les codes d'authentification de message (MAC). Vous n'avez pas besoin de beaucoup de mathématiques pour les gérer; la plupart concerne des ajouts d'entiers 32 bits et 64 bits (c'est l'arithmétique modulaire, avec 232 ou 264 comme module) et opérations au niveau du bit (XOR, AND ...).
Un tel 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 traduira 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 de la boucle est généralement un bon outil, mais si vous en faites trop, les performances chutent fortement.
Je suggère de commencer par implémenter les fonctions de hachage classiques (la famille SHA, décrites dans FIPS 180- ) et d'essayer de les rendre rapides. Comme point 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 il fonctionne également sur Windows et MacOS). Par exemple, sur mon PC:
$ openssl speed sha256
Doing sha256 for 3s on 16 size blocks: 4842590 sha256's in 3.00s
Doing sha256 for 3s on 64 size blocks: 2820288 sha256's in 2.99s
Doing sha256 for 3s on 256 size blocks: 1262067 sha256's in 2.99s
Doing sha256 for 3s on 1024 size blocks: 395563 sha256's in 3.00s
Doing sha256 for 3s on 8192 size blocks: 53564 sha256's in 3.00s
OpenSSL 0.9.8o 01 Jun 2010
built on: Wed Feb 23 00:47:27 UTC 2011
options:bn(64,64) md2(int) rc4(ptr,char) des(idx,cisc,16,int) aes(partial) blowfish(ptr2)
compiler: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN
-DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall -DMD32_REG_T=int
-DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM
available timing options: TIMES TIMEB HZ=100 [sysconf value]
timing function used: times
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
sha256 25827.15k 60367.37k 108056.57k 135018.84k 146265.43k
ce qui signifie qu'OpenSSL inclut une implémentation SHA-256 optimisée à la main dans Assembly, qui atteint 146 Mo/s lors du traitement des messages de 8 Ko. Sur la même machine, une implémentation C pure 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 de 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 la 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épendantes des clés qui pourraient être divulguées en utilisant des tables de recherche dans l'implémentation (essayez de rechercher "attaque de synchronisation du cache AES"); 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 plusieurs parties. Cela inclut le cryptage asymétrique (RSA, ElGamal), l'échange de clés (Diffie-Hellman) et les signatures numériques (RSA à nouveau, DSA ...). Le contenu mathématique y est beaucoup plus important et l'optimisation est un sujet beaucoup plus large que pour 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 to Elliptic Curve Cryptography . Bien qu'il s'agisse principalement de courbes elliptiques, il comprend un traitement général de la mise en œuvre des opérations dans les 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 obtenez-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, traite de la mise en œuvre efficace.
RSA est assez simple et est adéquatement décrit dans PKCS # 1 . Il y a possible attaques temporelles sur RSA, qui sont contrées par le masquage (oui, c'est un article "écrit par un chercheur", mais dans le domaine de la cryptographie, les chercheurs sont les gens qui comprennent ce qui se passe sur). Si vous maîtrisez l'arithmétique modulaire, vous pouvez essayer d'implémenter DSA ( FIPS 186- ). Diffie-Hellman est mathématiquement simple (il n'a besoin de rien de plus que ce qui est 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 remplacement populaire pour l'arithmétique modulaire; 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 de mathématiques. Là encore, le Guide de la cryptographie à courbe elliptique est la référence incontournable.
Il existe d'autres types d'algorithmes de cryptographie asymétriques, par exemple le McEliece cryptosystème (cryptage asymétrique; il existe une variante pour les signatures décrites par Niederreiter ) et algorithmes basés sur la réduction du résea . Mais ils ne bénéficient pas (encore) de normes publiées qui prennent en charge les détails de l'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 de mathématiques beaucoup plus élevée 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 implémenter la cryptanalyse linéaire de Matsui sur une version réduite de DES (8 tours au lieu de 16). DES est décrit dans FIPS 46- , qui est officiellement retiré, 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 du "décryptage") et il y a publié vecteurs de test 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 ex. en essayant de facteur grands entiers non premiers afin de casser les variantes RSA. Les mathématiques vont ici du non trivial au totalement inimaginable, donc cela pourrait être une courbe d'apprentissage trop abrupte pour commencer la cryptographie en essayant de casser RSA ...
Deux choses, vraiment:
La chose la plus importante à apprendre sur la crypto est l'humilité. Vous ne voulez jamais créer une nouvelle solution un problème - vous voulez copier du mieux que vous le pouvez les solutions qui ont été bien testées par d'autres. La plupart des échecs de cryptographie sont dus au fait que les gens ont une idée brillante, pensant qu'ils pourraient faire une optimisation pour améliorer une solution existante. Ce ne sont que les plus humbles qui parviennent finalement à trouver de nouvelles façons de faire.
La prochaine leçon est que vous avez désappris vos préjugés que vous avez obtenus de la télévision et des films, où un pirate informatique s'assoit devant un ordinateur et casse la crypto. Ce n'est pas lié à la cryptographie ou à une dramatisation de ce qui se passe vraiment. Par exemple, le film "Sneaker" est une dramatisation de ce qui se passerait si quelqu'un développait une puce qui pouvait prendre en compte de grands nombres entiers.
Le plus difficile dans l'apprentissage de la cryptographie est de faire la distinction entre les concepts techniques nécessaires pour comprendre le domaine en général et ceux dont vous n'aurez besoin que lorsque vous vous spécialiserez dans un domaine étroit. Prenez, par exemple, le post très bien noté ci-dessus. Vous devez comprendre la différence entre un algorithme "symétrique" et un algorithme "asymétrique" par rapport à un "hachage", mais lorsque l'auteur de cet article dit "Cela aide un peu à savoir ce qu'est un champ fini de la caractéristique 2", Je ne suis pas d'accord: cela n'a de sens que pour les docteurs qui recherchent la cryptographie, pas pour le reste d'entre nous qui veulent simplement savoir comment l'utiliser correctement.
Un bon moyen de parcourir les détails techniques est de choisir une cible et de travailler en arrière. Par exemple, aujourd'hui, Apple a mis à jour le système d'exploitation iPhone/iPad vers la version 4.3.5 pour corriger un bogue dans la validation des chaînes de certificats X.509. Comprendre le problème et pourquoi ils ont dû le corriger c'est exactement le genre de chose dont vous parlez dans votre message d'origine. Découvrez ce qu'est un certificat X.509, quelles sont les chaînes, et pourquoi elles doivent être validées, et pourquoi si vous ne le faites pas, un pirate utilisant un un outil comme 'sslsniff' peut vaincre le cryptage. Une fois que vous aurez bien compris tout cela, vous aurez atteint une grande partie de votre objectif que vous décrivez dans votre message d'origine.
Un autre exemple est un article de blog sur la vérification de la clé du pirate Comodo
Encore une fois, découvrez ce que le pirate Comodo a fait (créé des certificats signés pour Google et Yahoo), comment fonctionne la révocation des certificats et comment utiliser les outils pour valider ce certificat. Je le suggère comme un bon article car c'est un bon point de départ pour utiliser les outils "openssl", qui sont standard dans notre industrie.
Bonne chance!
Inscrivez-vous à Stanford's online Cryptography class qui commence en janvier prochain. C'est gratuit, en ligne, comprend à la fois la théorie (conférences vidéo et quiz) et la pratique (affectations de programmation), laissez-vous travailler à votre propre rythme et vous obtiendrez une déclaration de réussite si vous réussissez. Étant donné les différents échos que j'ai eu lors de la précédente session de cours en ligne de Stanford, je m'inscris définitivement à ce cours (ainsi qu'à celui sur la sécurité informatique).
Principes de conception technique de la cryptographie et applications pratiques par Niels Ferguson et Bruce Schneier. Le livre est destiné à être une mise à jour de la vénérable cryptographie appliquée, les auteurs sont bien connus dans le domaine et les critiques sont bonnes.
Vous pouvez jeter un œil à diverses compétitions de piratage/sécurité de la CTF (Capture The Flag). Ils incluent généralement des défis de cryptographie. Ils sont amusants et vous sortent de votre zone de confort pour résoudre les problèmes dans un temps limité. Voici un bon Calendrier CTF . Aussi, regardez quelques articles des FFC précédents, j'ai trouvé que beaucoup étaient très éducatifs et bien expliqués.
Pour les algorithmes de cryptographie:
Stinson Cryptographie: théorie et pratique
passe par le calcul de nombreux algorithmes de cryptographie d'une manière qui les rendrait assez faciles à implémenter, si c'est ce que vous vouliez faire.
Scheiner's Applied Cryptography est également un livre de référence sur le sujet. Se chevauche probablement un peu mais avec des algorithmes différents.
En ce qui concerne un livre vous expliquant explicitement comment les mettre en œuvre - je n'ai rien. Commercialement, ceux-ci ne sont pas toujours implémentés dans les logiciels, et c'est une industrie assez niche. Du point de vue du jeu, je dirais obtenir un livre expliquant l'algorithme, l'implémenter et comparer vos résultats avec une bibliothèque couramment utilisée pour le même algorithme.
De même, je n'ai rien sur la cryptanalyse, bien que je soupçonne que si vous choisissez un algorithme et google pour des choses comme "faiblesse dans" et "clés faibles", vous trouverez des articles intéressants et d'autres informations. La dernière fois que j'ai dû écrire un article sur quelque chose comme ça (il y a 10 ans +) c'est essentiellement ce que j'ai fait ...
Je recommande Cryptography Engineering: Design Principles and Practical Applications . C'est le livre parfait pour vous. Il décrit comment concevoir et implémenter des cryptosystèmes, du point de vue d'un concepteur et d'un implémenteur de systèmes. C'est un livre très pragmatique, avec une perspective dérivée des années d'expérience des auteurs. Le mot "ingénierie" dans le titre est vraiment approprié. Je pense que vous le trouverez une ressource inestimable vous aidant à hiérarchiser ce que vous devriez dépenser le plus d'énergie à vous soucier de ce qui peut mal tourner et comment vous assurer que ces mauvaises choses ne vous arrivent pas.
J'ajouterais également que vous jetez un œil à Matasano crypto challenges car vous avez déjà des compétences en programmation.
Depuis leur site Web:
COMBIEN DE CRYPTO DOIS-JE SAVOIR? Aucun. C'est le but.
QUE DOIS-JE SAVOIR? Vous voudrez pouvoir coder efficacement dans n'importe quelle langue. Nous avons reçu des soumissions en C, C++, Python, Ruby, Perl, Visual Basic, X86 Assembly, Haskell et LISP.
Tous leurs défis sont basés sur des vulnérabilités cryptographiques du monde réel, vous devriez donc apprendre des trucs sympas pour les résoudre.
Si vous voulez une compréhension de la théorie de la cryptographie, écrite d'une manière accessible aux praticiens, essayez "Introduction to Modern Cryptography" par Katz et Lindell.
Apprendre la cryptographie à partir de zéro peut parfois sembler difficile, mais si vous avez les bonnes ressources, vous allez adorer. Voici mes sites préférés pour vous aider à commencer à apprendre la cryptographie aujourd'hui.