Je voudrais précéder cette question en déclarant que je comprends parfaitement les dangers de l'écriture de vos propres algorithmes de cryptage, et je n'utiliserais jamais, jamais, un cryptage maison pour sécuriser les données de quiconque sauf moi-même.
Aujourd'hui, j'ai été affecté à un projet de semestre en informatique qui rassemble tout ce que nous avons appris dans un seul programme. Une partie des fonctionnalités de ce programme est qu'il peut crypter et décrypter les chaînes. Nous devons écrire ces méthodes de chiffrement nous-mêmes, donc nous ne pouvons pas utiliser quoi que ce soit intégré au langage que nous utilisons (Java). Enfin, nous devons éviter tout ce qui utilise une clé pour le chiffrement.
Maintenant, après avoir parlé à certains de mes camarades de classe, il semble que presque tout le monde utilise ROT13 ou une autre méthode similaire. Parce que je suis un surpassant et parce que je ne veux pas être comme tout le monde, je veux concevoir ma propre méthode de cryptage. Cependant, je suis un peu perdu par où commencer. Alors, quelles techniques de base ou avancées existe-t-il pour le chiffrement?
Si vous êtes généralement intéressé par la cryptographie au-delà de votre projet :
Cela dépend du type de cryptage que vous souhaitez effectuer. Énorme mise en garde: cette réponse ne vise qu'à vous orienter dans la bonne direction théorique. Je recommande fortement de faire beaucoup de lecture avant de sauter - plus vous lirez, plus vous comprendrez comment les chiffres précédents ont été brisés et ne font pas les mêmes erreurs.
Clé publique
Pour utiliser un système à clé publique, vous avez besoin d'un fonction Trapdoor . Malheureusement, les conseils sur wikipedia sont assez précis:
Plusieurs classes de fonctions ont été proposées, et il est vite devenu évident que les fonctions de trappe sont plus difficiles à trouver qu'on ne le pensait initialement.
Les fonctions de trappe sont assez difficiles; Les permutations de trappe (où les ensembles de sortie et d'entrée des fonctions sont les mêmes et en tant que telles la fonction "permute" l'entrée à l'intérieur de l'ensemble) sont encore plus difficiles. En gros, le problème de la factorisation principale et le problème du logarithme discret sont deux "grands". Il y a des chances dans ce domaine, en utiliser un existant sera de loin l'approche la plus simple.
Clé symétrique
Les algorithmes à clé symétrique sont délibérément réversibles, mais sans l'une des entrées (la clé) sont conçus pour être très difficiles à inverser. L'idée sous-jacente est le principe de confusion/diffusion . Les techniques courantes dans les chiffrements modernes incluent réseaux de permutation de substitution et réseaux feistel . Vous devriez également envisager de lire modes de fonctionnement de chiffrement par blocs .
D'accord, par où commencer?
En lisant - autant que possible. Je n'aime pas le conseil standard "ne concevez pas votre propre crypto". Je pense que les gens devraient essayer s'ils le veulent. Mais je ne saurais trop insister sur la difficulté de bien faire les choses. Comme vous disposez d'un temps limité pour votre projet, une technique pourrait être d'utiliser un exemple simple de chiffrement existant, donc:
Pour votre projet
En tant qu'exercice éducatif RC4 est très facile à mettre en œuvre. Il était une fois (il n'y a pas si longtemps) utilisé pour protéger le trafic SSL/WEP - parfois, il est toujours utilisé, vous utiliseriez donc un vrai chiffrement. Il a certains problèmes de sécurité - les comprendre vous aidera également pour votre éducation cryptographique générale. Cependant, comme votre exigence est une sécurité moins absolue et plus d'apprentissage, j'aurais pensé que ce serait idéal.
Si vous vous sentez assez ambitieux et connaissez bien votre langue, AES n'est pas si difficile à mettre en œuvre en mode ECB. FIPS-197 est assez lisible et explique généralement l'algorithme d'une manière assez accessible.
Vous avez raison de considérer ROT13 comme un mauvais exemple. Même sans savoir que le décalage de chaque caractère était de 13 positions, en supposant que vous utilisez ASCII vous essayez simplement chacun des 127 (ou 255 pour ASCII étendu) décalages de votre texte chiffré jusqu'à ce que celui de droite tombe Déchiffrer est donc assez simple, même sans la clé.
Vous devez éviter tout ce qui utilise une clé? Personnellement, je ne vois pas comment vous pouvez appeler un algorithme "cryptage" s'il n'utilise pas de clé.
Vous pourriez envisager d'écrire votre propre implémentation du DES simplifié. Comme son nom l'indique, Simplified DES (ou S-DES) est une version grandement simplifiée de DES. Il utilise une clé de 10 bits, et il est assez simple pour travailler avec un crayon et du papier.
Cet article est le premier hit de Google pour "DES simplifié". Il y a aussi un simulateur visuel sur http://edipermadi.wordpress.com/2008/01/12/simplified-des-simulator/ .
Je ne veux pas gâcher votre plaisir, mais vous voulez penser à ce qui suit:
Il s'agit d'un projet semestriel, donc ce n'est pas quelque chose auquel vous pouvez (ou devriez) répondre du jour au lendemain. Le code lui-même peut ne prendre qu'un jour ou deux. Le véritable apprentissage consiste à trouver des solutions basées sur les contraintes données.
Vous devriez lire The Handbook Of Applied Crypgoraphy . Ce livre est également connu sous le nom de "Manuel". C'est gratuit et bien écrit. Cependant le chapitre 2, "Contexte mathématique" est assez rigide, la plupart de ces concepts ne sont pas enseignés dans mon université publique locale (j'ai regardé).
Si vous voulez voir une version simplifiée de la "confusion" et de la "diffusion" complexes, William Stallings a écrit un excellent Simplified DES implementation .
C'est assez facile que je l'ai dessiné (et fait les transpositions) sur du papier millimétré. Mais il vous guidera à travers toutes les fonctions de base DES utilise et vous guidera à travers un seul tour du processus de chiffrement-déchiffrement.
En fonction des contraintes qui vous sont imposées, vous pouvez en fait créer un cryptage extrêmement difficile à cracker assez facilement - ce cryptage a des défauts pratiques qui le rendent fondamentalement inutilisable dans le monde réel, mais vous devriez remplir le ROT13, les utilisateurs de César, etc. assez facilement - en gros vous allez créer un système d'encodage entropique, qui vous permet de créer un pad unique
Écrivez-vous quelque chose à raw lire tous les fichiers sur votre lecteur de disque - c'est assez facile, google pour une analyse récursive hiérarchique du répertoire, ouvrez tous les fichiers raw/binary et aspirez leur contenu
Au fur et à mesure que vous commencez à diffuser dans chaque flux d'octets, créez-vous un fichier maître dans lequel vous recherchez une récurrence de sous-séquences (je vais les appeler des chaînes à partir de maintenant, car c'est ce qu'elles sont, ce ne sont tout simplement pas des chaînes de texte) dans le entrée - vous devez créer un algorithme qui, au fil du temps, préfère les sous-séquences correspondantes les plus longues mais peut récursivement découper l'entrée en chaînes plus petites - si vous regardez http://en.wikipedia.org/wiki/Huffman_coding vous verrez un algorithme particulier pour accomplir cela, mais vous n'avez pas besoin d'aller aussi loin - mais les implémentations produiront probablement des fragments de code qui vous simplifieront la vie.
Maintenant, pour encoder quelque chose, prenez la chaîne d'entrée et appliquez la même opération, en trouvant les sous-chaînes correspondantes de plus longue longueur dans le fichier maître et en remplaçant la chaîne d'entrée par le décalage et la longueur de la sous-chaîne correspondante dans le fichier maître - notez que cela correspondra à tout chaîne, car à la fin de la journée, vous rechercherez des bits uniques.Une garde que vous devrez utiliser est que vous devez parcourir l'ensemble de toutes les chaînes correspondantes avant de commencer à réutiliser les mêmes index - imaginez un fichier maître où vous aviez alterné 1 et 0 et vous ne pouviez faire correspondre que les entrées au niveau du bit (techniquement impossible mais supportez-moi) - si vous receviez une chaîne de 5 1, vous la coderiez en 1: 1,3: 1,5 : 1,7: 1,9: 1 (oui, un défaut est que l'encodage peut devenir horriblement inefficace dans certains cas) (nb - si vous encodez des bits, vous affaiblirez le code - des points supplémentaires si vous ne déplacez que l'offset dans le message, mais c'est une mauvaise stratégie de cartographie multidimensionnelle en dehors de la portée de ce post)
Gardez une trace du nombre d'indices réutilisés - votre objectif est d'avoir une table maître suffisamment grande pour que cela ne se produise jamais - si cela se produit et que vous ne codez qu'un seul message, il est pratiquement certain que l'univers mourra de mort par la chaleur avant que le code puisse être cracké plus vous encodez de messages OERE LES INDICES SONT RÉUTILISÉS, plus votre code est comprimé (analyse de langage, analyse de modèle, etc.) Maintenant, voici le problème - afin d'utiliser ce code avec une autre partie - vous devez leur obtenir une copie du table principale - vous ne devez le faire qu'en personne, vous devez toujours garder le support de transfert sous votre contrôle, et vous devez le détruire lorsque le transfert est terminé - et si une machine sur laquelle se trouve la table principale est comprimée, votre code est grillé - jusque-là, c'est sacrément difficile
S'amuser
Pour le cryptage bidirectionnel, la plupart des algorithmes utilisent un opérateur x ou, en comparant le code binaire d'une clé et les données binaires de l'entrée, cela pourrait ne pas vous convenir alors, car vous ne pouvez pas utiliser une clé ... cependant, c'est Comment ça fonctionne:
Données d'entrée: 10011101101001 Clé: 123 = 1111011
La clé est plus petite que l'entrée, elle doit donc être répétée:
Données d'entrée: 10011101101001 Clé: 123 = 11110111111011
(in Java use one variable to count in a for each or a while loop through all the bit of the data input ...) Utilisez maintenant le x ou le principal pour générer le résultat crypté (deux façon hash) boucle à travers chaque bit dans les données d'entrée et comparez-le au bit correspondant dans la clé, si identique, ajoutez 0 au résultat, sinon, ajoutez 1 au résultat ... Le résultat sera alors:
Données d'entrée: 10011101101001 Clé: 123 = 11110111111011 Résultat = 01101010010010
Pour décrypter les données, exécutez simplement le bac de données cryptées:
Données d'entrée: 01101010010010 Clé: 123 = 11110111111011 Résultat = 10011101101001
Idéalement, vous utiliseriez une fonction de hachage comme sha, md5, ripemd etc ... pour générer la clé, puis la transformer en binaire ... si vous ne pouvez pas utiliser un algorithme prédéfini, vous pouvez créer votre propre algorithme pour générer la clé de être comparé ... assurez-vous que tous les bits de l'entrée dépendent les uns des autres pour générer le résultat ... exemple:
mot de passe: abcdefghi abc = 123456789 (a = 1, b = 2, c = 3 etc ...)
boucle maintenant chaque bit (chiffre) et ajoutez-les avec un compteur, exemple: count = 0 result = "" pour chaque chiffre du mot de passe do {result = result & (digit + result [count-1]) * count) count = count +1}
résultat = (1 + 0) * 1 = 1 (2 + 1) * 2 = 6 (3 + 2) * 3 = 15 (4 + 3) * 4 = 28 (5 + 4) * 5 = 45 (6+ 5) * 6 = 66 (7 + 6) * 7 = 91 (8 + 7) * 8 = 120 (9 + 8) * 9 = 153
résultat clé = 16152845669120153 Binaire: 111001011000101110110101110100001110000011100010011001 (Ceci est un très mauvais exemple tu ... tu devrais penser à travers un bon algorithme ... celui où les deux entrées de départ se combinent et forment le troisième, puis les troisième et quatrième vont de pair avec le résultat de la première combinaison pour générer le cinquième résultat ...)
mais là encore, si vous ne pouvez pas utiliser une clé, vous ne pouvez pas utiliser cela ...
Découvrez la classe Crypto I de l'Université de Stanford sur coursera. Il décompose les chiffrements de flux et de blocs ainsi que le chiffrement à clé publique. Vous seriez beaucoup plus informé si vous ne regardiez que les premières conférences. De plus, le cours couvre également les vulnérabilités et les méthodes de rupture des implémentations cryptographiques.