web-dev-qa-db-fra.com

Écrire mon propre algorithme de chiffrement

J'étudie actuellement l'informatique à l'université (UK college aka not University) et les cours m'ennuient à mort. Je code depuis un bon moment maintenant principalement dans OO langages tels que C # et Java mais je m'ennuie souvent et j'abandonne rapidement parce que la majorité d'entre eux est les choses ennuyeuses de l'interface utilisateur que je déteste faire, les projets que je propose ont rarement beaucoup à voir avec la conception de code et la création d'algorithmes. Je veux commencer à écrire mes propres algorithmes et commencer à m'éloigner du côté de la convivialité et à commencer à apprendre des choses qui m'intéresse, à savoir la cryptographie et la compression. Je veux écrire mon propre algorithme de cryptage, pour crypter les octets d'un fichier ou d'une chaîne. J'ai quelques questions:

  • Par où commencer? Quels livres/documents sont recommandés pour commencer avec la cryptographie?
  • Ai-je besoin de connaissances approfondies en cryptographie pour commencer un algorithme de base?
  • C # sera-t-il correct pour mettre en pratique un algorithme de chiffrement?

Toute aide serait sincèrement appréciée. Je veux commencer à écrire du code, donc quand il s'agit de postuler à uni, j'ai quelque chose à montrer pour toutes mes affirmations audacieuses sur ma candidature!

51
Confuto

Bien sûr, vous pouvez commencer petit et implémenter vos propres algorithmes. Mais ne supposent pas qu'ils fournissent une sécurité au-delà de l'obscurcissement .

La chose difficile quand il s'agit de cryptographie est de trouver les raisons pour lesquelles quelque chose est sécurisé. Vous ne pourrez pas décider que dans quelques mois et si vous vous sentez comme si vous étiez à ce moment-là, vous vous trompez probablement.

Il est beaucoup plus facile de trouver des raisons pour lesquelles les choses ne sont pas sûres que des raisons pour lesquelles elles sont sécurisées, donc si vous voulez commencer quelque part, développez vos propres algorithmes jusqu'à ce que vous pensiez qu'ils sont sécurisés, puis essayez de découvrir pourquoi ils ne le sont pas et de trouver des moyens de les attaquer.

La plupart des erreurs sont commises lors de l'implémentation d'algorithmes. Donc, si vous voulez obtenir un emploi bien rémunéré, vous pouvez apprendre à mettre en œuvre correctement ce genre de choses.

Je recommanderais de commencer à implémenter quelque chose comme AES et de continuer vers différents modes de fonctionnement comme CBC ou CCM et de découvrir pourquoi le caractère aléatoire est important. Continuez avec SHA-2 et HMAC et passez à la cryptographie asymétrique. Vérifiez toujours ce que les autres ont fait et pourquoi ils l'ont fait et jetez un œil spécial sur les attaques par canal latéral et comment elles sont effectuées. Si vous êtes à ce point, vous trouverez votre chemin à suivre.

La référence pour commencer serait le "HAC", qui est disponible gratuitement en ligne: http://cacr.uwaterloo.ca/ hac /

[Edit] Une suggestion de JRsz qui ne sera pas enterrée dans les commentaires. Un bon livre pour les débutants: http://crypto-textbook.com/

137
fr00tyl00p

Coursera

Voici mes 2 cents:

Rejoignez le cours en ligne de Coursera Cryptography:

Le cours dure six semaines. Chaque semaine, il y a plusieurs vidéos de cours, un quiz gradué et une tâche de programmation facultative. (Et ces affectations impliquent l'implémentation de parties cryptographiques.)

À la fin des six semaines, il y a un test.

Si vous voulez être mis au défi, c'est la bonne façon de procéder. C'est beaucoup de travail. Je vous suggère de planifier plus de 10 heures par semaine. Plus si vous voulez aussi faire la tâche de programmation.

( Edit: Voici une table des matières pour une exécution précédente de cette classe . )

Clarification: Les affectations de programmation sont juste là pour générer une compréhension plus approfondie du sujet. Ils ne sont explicitement PAS quelque chose que vous êtes ensuite censé libérer dans la nature.
Au contraire: Le message "Ne l'implémentez jamais vous-même!" se répète encore et encore. (Et sans trop en dévoiler: chaque fois "Il suffit de l'implémenter vous-même!" est sur l'un des tests à choix multiples, alors c'est faux.)

37
StackzOfZtuff

Commencez par casser, pas par construire le vôtre. Il y a un nombre inquiétant de messages d'échange de pile de personnes qui ont écrit leurs propres algorithmes. Jetez un coup d'œil et découvrez ce qui ne va pas avec eux. (Ne regardez pas les réponses publiées.) [Les bonnes recherches incluent "Est-ce sécurisé" et "Qu'est-ce qui ne va pas avec cet algorithme".]

Ce n'est que lorsque vous avez trouvé des problèmes dans le travail d'autres personnes que vous devez essayer d'implémenter des algorithmes d'autres personnes. (Le commentaire de @ stackzofztuff sur Coursera n'est pas mauvais - si je me souviens bien, Dan Boneh commence de cette façon, avec plus de structure que de fouiner ici.)

21
Adam Shostack

Applied Cryptography de Bruce Schneier est une lecture incontournable si vous voulez commencer à étudier ce domaine. Je suis surpris que personne ne l'ait suggéré auparavant.

Et oui, vous devez en savoir beaucoup sur la crypto avant même d'essayer de rouler vos propres algorithmes pour le plaisir. Ne pensez même pas à les utiliser pour des problèmes du monde réel, cependant - il y a déjà beaucoup de mauvaise crypto autour.

Concernant la programmation, évitez les langages propriétaires comme la peste. Je suggère C ou même C++.

13
dr_

Un bon début serait d'implémenter des algorithmes existants et d'apprendre comment ils fonctionnent en profondeur. Par exemple, l'algorithme de bloc unique est facile à apprendre et à mettre en œuvre, et étudier ses forces et ses faiblesses vous aidera à démarrer. Cela vous permettra également de vous familiariser avec le type de torsion de bits qui est important en cryptographie. Faire une recherche sur "pad unique" vous permettra de démarrer.

10
Scott C Wilson

Juste pour empiler les grandes réponses qui sont ici, avec quelque chose d'un angle différent.

Si vous faites l'hypothèse que votre algorithme v1 sera peu sûr et horrible, et que votre v100 ne sera que très légèrement meilleur, mais tout aussi peu sûr. (tout comme votre v1000)

Avec cette hypothèse à l'esprit, vous pouvez apprendre beaucoup en résolvant les problèmes que la cryptographie a dû résoudre pour devenir la science qu'elle est aujourd'hui. c'est-à-dire réinventer la roue.

Personnellement, je trouve que réinventer la roue est un excellent moyen d'apprendre une tâche complexe. Cela vous donne quelque chose à résoudre. Si c'est votre truc, il y a moins de choses plus difficiles à résoudre que la cryptographie.

De cette façon, vous pouvez aller à l'université et dire, eh bien j'ai conçu mon propre algorithme de cryptographie comme un moyen d'apprendre à résoudre des problèmes difficiles. À la v50, l'algorithme est nul, mais ce sont les leçons que j'ai apprises, les solutions que j'ai trouvées, et c'est ainsi qu'elles sont résolues dans le monde réel.

Il y a une grande différence entre dire que j'ai écrit un `` bon '' protocole de cryptographie et dire que j'ai écrit un protocole qui est presque certainement très faible mais le but n'était pas de créer un protocole sécurisé. Personnellement, j'aurais beaucoup de respect pour quelqu'un qui a dit ce dernier. (Je ferais probablement un signe de tête à l'ancien - et je lui montrerais rapidement la porte)

6
Michael B

Vous pouvez implémenter des algorithmes de chiffrement déjà existants, mais la conception de votre propre algorithme de chiffrement est l'une des questions les plus complexes que vous puissiez traiter. Pour une introduction générale, je recommande fortement cette chaîne: https://www.youtube.com/channel/UC1usFRN4LCMcfIV7UjHNuQg/videos ou le livre "Understanding Cryptography" de Christoph Paar et Jan Pelzl ( http://crypto-textbook.com/ ). Je suppose que vous visez des algorithmes symétriques et je vous recommande de commencer à lire beaucoup de théorie à leur sujet, ce qui est sûr, était dangereux (historicle) et explicitement comment les algorithmes de pointe ont-ils fait leur chemin vers ce qu'ils sont (comment AES a-t-il été développé, choisi, etc.).

Vous rencontrerez de nombreux problèmes de mathématique lorsque vous traitez avec différents modèles d'attaquants, même dans la partie symétrique. La cryptographie asymétrique est virile basée sur des problèmes de mathématique et il existe des attaques très délicates qui sont très puissantes contre la cryptographie asymétrique.

L'essentiel est de ne pas développer vos propres algorithmes, sauf si vous avez de nombreuses années d'expérience et que vous êtes très familier avec le sujet (toutes ses parties). La mise en œuvre de certains d'entre eux est néanmoins une bonne idée, mais si vous recherchez une sorte de projet, pourquoi n'écrivez-vous pas un programme qui utilise des algorithmes déjà existants et décrypte certaines données pour vous. Vous aurez suffisamment de problèmes pour y faire face, car un algorithme sécurisé n'est pas du tout une garantie de cryptage sécurisé. Différents modes de fonctionnement seront importants sur cette question ainsi que sur d'autres problèmes.

3
JRsz

Vous pouvez suivre la suggestion de Scott Wilson sur le bloc One-Time, mais avec de vraies données aléatoires. Vous pouvez par exemple considérez le bruit de la webcam de l'ordinateur. Laissez la webcam prendre quelques photos d'une scène statique, convertir les images en images à virgule flottante 32 bits, normaliser les images à la même luminosité, prendre la moyenne, puis soustraire l'une des images de la moyenne. Si vous mappez des valeurs de pixels négatifs à 0 et des valeurs de pixels positives à 1, vous avez presque des bits parfaitement aléatoires, qui ne sont pas corrélés lorsque les pixels ne sont pas trop proches. Application de l'algorithme de von Neumann à des paires de bits prises à partir de pixels distants:

(0,1) ---> 0

(1,0) ---> 1

(0,0) et (1,1) sont rejetés

donnera des bits aléatoires parfaits avec 0 et 1 ayant exactement 50% de probabilité.

2
Count Iblis

Allez-y, écrivez un algorithme mais à la fin confiez une tâche à l'un de vos amis/boursiers qui s'occupe régulièrement de la cryptographie; dites-leur de casser votre cryptage s'ils le peuvent.

Vous remarquerez qu'ils seront en mesure de le briser en quelques minutes et vous serez étonné de penser au nombre de failles qui ont donné le jeu aux personnes ayant connaissances approfondies en cryptographie ( pour qoute vos mots)

C'est exactement ce qui m'est arrivé lorsque j'apprenais à programmer il y a longtemps et que je voulais défier certains gars qui étaient intelligents dans de telles choses et j'ai échoué lamentablement. À tel point qu'ils pouvaient même déchiffrer le message imprimé sur un papier en utilisant uniquement leur esprit et leurs compétences.

Vous pouvez certainement en écrire un et le perfectionner au fil du temps, mais en aucun cas il ne peut être sécurisé de sitôt contre les personnes ayant cette connaissance.

Ce sera un bon point de départ (ou peut-être même un point d'arrêt) dans votre quête pour écrire votre propre algorithme :)

2
Hanky Panky