it-swarm-eu.dev

Techniken zum Schreiben von Verschlüsselungsalgorithmen (ausschließlich für den persönlichen Gebrauch)

Ich möchte diese Frage vorwegnehmen, indem ich erkläre, dass ich die Gefahren des Schreibens Ihrer eigenen Verschlüsselungsalgorithmen vollständig verstehe und niemals eine hausgemachte Verschlüsselung verwenden würde, um die Daten von jemand anderem als mir selbst zu sichern.

Heute wurde mir ein Informatik-Semesterprojekt zugewiesen, das alles, was wir gelernt haben, in einem Programm zusammenfasst. Ein Teil der Funktionalität dieses Programms besteht darin, dass es Strings verschlüsseln und entschlüsseln kann. Wir müssen diese Verschlüsselungsmethoden selbst schreiben, damit wir nichts verwenden können, was in die von uns verwendete Sprache (Java) eingebaut ist. Schließlich müssen wir alles vermeiden, was einen Schlüssel zur Verschlüsselung verwendet.

Nachdem ich mit einigen meiner Klassenkameraden gesprochen habe, scheint es, als würde fast jeder ROT13 oder eine andere ähnliche Methode verwenden. Weil ich ein Überflieger bin und nicht wie alle anderen sein möchte, möchte ich meine eigene Verschlüsselungsmethode entwickeln. Ich bin jedoch etwas verloren, wo ich anfangen soll. Welche grundlegenden oder fortgeschrittenen Techniken gibt es für die Verschlüsselung?

18
Josh

Wenn Sie sich allgemein für Kryptografie außerhalb Ihres Projekts interessieren :

Es hängt davon ab, welche Art von Verschlüsselung Sie durchführen möchten. Riesige Einschränkung: Bei dieser Antwort geht es nur darum, Sie in die richtige theoretische Richtung zu weisen. Ich empfehle dringend, vor dem Einstieg viel zu lesen - je mehr Sie lesen, desto besser werden Sie verstehen, wie frühere Chiffren gebrochen wurden, und nicht dieselben Fehler machen.

Öffentlicher Schlüssel

Für den Betrieb eines Public-Key-Systems benötigen Sie eine Trapdoor-Funktion . Leider ist der Rat auf Wikipedia ziemlich genau:

Es wurden mehrere Funktionsklassen vorgeschlagen, und es wurde schnell klar, dass Trapdoor-Funktionen schwerer zu finden sind als ursprünglich angenommen

Falltürfunktionen sind ziemlich schwierig; Trapdoor-Permutationen (bei denen die Ausgabe- und Eingabesätze der Funktionen gleich sind und die Funktion daher die Eingabe innerhalb des Satzes "permutiert") sind noch schwieriger. Grob gesagt sind das Hauptfaktorisierungsproblem und das diskrete Logarithmusproblem zwei "große". In diesem Bereich stehen die Chancen gut, dass die Verwendung eines vorhandenen bei weitem der einfachste Ansatz ist.

Symmetrischer Schlüssel

Symmetrische Schlüsselalgorithmen sind absichtlich reversibel, aber ohne einen der Eingänge (den Schlüssel) sind sie sehr schwer umzukehren. Die zugrunde liegende Idee ist das Verwirrungs-/Diffusionsprinzip . Übliche Techniken in modernen Chiffren umfassen Substitutionspermutationsnetzwerke und Feistelnetzwerke . Sie sollten auch Block-Chiffrier-Betriebsarten nachlesen.

Richtig, großartig, wo soll ich anfangen?

Durch Lesen - so viel du kannst. Ich mag den Standard-Rat "Entwerfe keine eigene Krypto" nicht. Ich denke, die Leute sollten es versuchen, wenn sie wollen. Aber ich kann nicht genug betonen, wie schwer es ist, richtig zu machen. Da Sie nur eine begrenzte Zeit für Ihr Projekt haben, besteht eine Technik möglicherweise darin, ein einfaches Beispiel für eine vorhandene Verschlüsselung zu verwenden.

Für Ihr Projekt

Als pädagogische Übung ist RC4 sehr einfach zu implementieren. Es war einmal (vor nicht allzu langer Zeit), als dies zum Schutz des SSL/WEP-Verkehrs verwendet wurde - manchmal wird es immer noch verwendet, sodass Sie eine echte Verschlüsselung verwenden würden. Es hat einige Sicherheitsprobleme - das Verständnis dieser hilft Ihnen auch bei Ihrer allgemeinen Krypto-Ausbildung. Da Ihre Anforderung jedoch weniger absolute Sicherheit und mehr Lernen ist, hätte ich gedacht, dass dies ideal wäre.

Wenn Sie sich ehrgeizig fühlen und Ihre Sprache gut kennen, ist AES auch im EZB-Modus nicht so schwer zu implementieren. FIPS-197 ist gut lesbar und erklärt den Algorithmus im Allgemeinen auf ziemlich leicht zugängliche Weise.

Sie haben Recht, ROT13 als schlechtes Beispiel zu betrachten. Selbst wenn Sie nicht wissen, dass der Versatz jedes Zeichens 13 Stellen beträgt, nehmen Sie an, dass Sie ASCII] verwenden. Probieren Sie einfach jeden der 127 (oder 255 für erweiterten ASCII) Versätze Ihres Chiffretextes aus, bis der richtige fällt out. Es zu entschlüsseln ist daher auch ohne Schlüssel ziemlich trivial.

15
user2213

Sie müssen alles vermeiden, was einen Schlüssel verwendet? Persönlich kann ich nicht sehen, wie man einen Algorithmus "Verschlüsselung" nennen kann, wenn er keinen Schlüssel verwendet.

Sie können eine eigene Implementierung von Simplified DES schreiben. Wie der Name schon sagt, ist Simplified DES (oder S-DES) eine stark vereinfachte Version von DES. Es verwendet einen 10-Bit-Schlüssel und ist einfach genug, um mit Bleistift und Papier zu arbeiten.

Dieses Papier ist der erste Google-Hit für "Simplified DES". Es gibt auch einen visuellen Simulator unter http://edipermadi.wordpress.com/2008/01/12/simplified-des-simulator/ .

8
Jonathan

Ich möchte Ihren Spaß nicht verderben, aber Sie möchten über Folgendes nachdenken:

  1. Was ist eigentlich Verschlüsselung? Was sind die Eigenschaften von Dingen, die verschlüsseln und entschlüsseln, und warum tun wir das als Gesellschaft? Sie möchten sowohl über die Eigenschaften als auch über den Prozess nachdenken.
  2. Was ist ein Schlüssel? Aufgrund Ihrer Recherchen möchten Sie möglicherweise von Ihrem Ausbilder eine Klärung dieses Punktes anfordern.
  3. Erstellen Sie ein Klassifizierungssystem für alle Familien von Verschlüsselungstechniken. Wenn Sie diese Recherche durchführen, finden Sie möglicherweise eine oder zwei interessante Antworten.

Dies ist ein semesterbasiertes Projekt, daher können (oder sollten) Sie es nicht über Nacht beantworten. Der Code selbst kann nur ein oder zwei Tage dauern. Das eigentliche Lernen besteht darin, Lösungen zu finden, die auf den gegebenen Einschränkungen basieren.

4
logicalscope

Sie sollten Das Handbuch der angewandten Krypgoraphie lesen. Dieses Buch ist auch als "The Handbook" bekannt. Es ist kostenlos und gut geschrieben. Kapitel 2, "Mathematischer Hintergrund", ist jedoch ziemlich steif. Die meisten dieser Konzepte werden nicht an meiner örtlichen öffentlichen Universität unterrichtet (ich habe nachgesehen).

2
rook

Wenn Sie eine vereinfachte Version der komplexen "Verwirrung" und "Verbreitung" sehen möchten, hat William Stallings eine ausgezeichnete Simplified DES Implementierung geschrieben.

Es ist einfach genug, dass ich es auf Millimeterpapier gezeichnet habe (und die Transpositionen gemacht habe). Aber es führt Sie durch alle Grundfunktionen, die DES verwendet), und führt Sie durch eine einzelne Runde des Verschlüsselungs-/Entschlüsselungsprozesses.

2
Joseph Kern

Abhängig von den Einschränkungen, die Ihnen auferlegt werden, können Sie tatsächlich eine äußerst schwer zu knackende Verschlüsselung relativ einfach erstellen - diese Verschlüsselung weist praktische Mängel auf, die sie in der realen Welt grundsätzlich unbrauchbar machen, aber Sie sollten die ROT13-, Caesar-Benutzer usw. im Grunde genommen recht handlich stopfen Sie erstellen ein Entropiecodierungssystem, mit dem Sie ein einmaliges Pad erhalten

Schreiben Sie sich etwas, um alle Dateien auf Ihrem Laufwerk roh zu lesen - dies ist ziemlich einfach. Suchen Sie bei Google nach einem hierarchischen rekursiven Verzeichnisscan, öffnen Sie alle Dateien roh/binär und saugen Sie deren Inhalt ein

Wenn Sie mit dem Streaming in jedem Byte-Stream beginnen, erstellen Sie sich eine Master-Datei, in der Sie nach einer Wiederholung von Teilsequenzen suchen (ich werde diese von nun an als Zeichenfolgen bezeichnen, da dies das ist, was sie sind, sie sind einfach keine Textzeichenfolgen) Eingabe - Sie müssen einen Algorithmus erstellen, der im Laufe der Zeit die längstmöglichen übereinstimmenden Teilsequenzen bevorzugt, die Eingabe jedoch rekursiv in kleinere Zeichenfolgen aufteilen kann - wenn Sie sich http://en.wikipedia.org/wiki/Huffman_coding) ansehen Sie werden einen bestimmten Algorithmus sehen, um dies zu erreichen, aber Sie müssen nicht so weit gehen - aber Implementierungen werden wahrscheinlich Codefragmente ergeben, die Ihr Leben vereinfachen.

Um etwas zu codieren, nehmen Sie die Eingabezeichenfolge und wenden Sie dieselbe Operation an. Suchen Sie die übereinstimmenden Teilzeichenfolgen mit der längsten Länge in der Masterdatei und ersetzen Sie die Eingabezeichenfolge durch den Versatz und die Länge der übereinstimmenden Teilzeichenfolge in der Masterdatei. Beachten Sie, dass dies mit allen übereinstimmt Zeichenfolge, da Sie am Ende des Tages nach einzelnen Bits suchen müssen. Ein Schutz, den Sie verwenden müssen, besteht darin, dass Sie alle übereinstimmenden Zeichenfolgen durchlaufen müssen, bevor Sie dieselben Indizes wiederverwenden können - stellen Sie sich eine Masterdatei vor Wenn Sie abwechselnd Einsen und Nullen hatten und nur Eingaben auf Bitebene abgleichen konnten (technisch unmöglich, aber ertragen Sie es mit mir). Wenn Sie eine Zeichenfolge mit 5 Einsen erhalten hätten, würden Sie diese als 1: 1,3: 1,5 codieren : 1,7: 1,9: 1 (Ja, ein Fehler ist, dass diese Codierung in bestimmten Fällen grausam ineffizient werden kann) (nb - Wenn Sie Bits codieren, schwächen Sie den Code - zusätzliche Punkte, wenn Sie nur den Offset verschieben die Nachricht, aber das ist eine böse mehrdimensionale Mapping-Strategie außerhalb des Rahmens dieses Beitrags)

Behalten Sie die Anzahl der wiederverwendeten Indizes im Auge - Ihr Ziel ist es, eine Haupttabelle zu haben, die groß genug ist, dass dies niemals geschieht - wenn dies geschieht und Sie nur eine Nachricht codieren, ist es ziemlich sicher, dass das Universum an Hitzetod sterben würde, bevor der Code sein könnte geknackt Je mehr Nachrichten Sie codieren, wo Indizes wiederverwendet werden, desto mehr wird Ihr Code komprimiert (Sprachanalyse, Musteranalyse usw.). Hier ist der Haken: Um diesen Code mit einer anderen Partei zu verwenden, müssen Sie ihnen eine Kopie des Codes besorgen Mastertabelle - Sie sollten dies nur persönlich tun, Sie sollten das Übertragungsmedium immer unter Ihrer Kontrolle halten und Sie sollten es zerstören, wenn die Übertragung abgeschlossen ist - und wenn eine Maschine, auf der sich die Mastertabelle befindet, komprimiert wird, ist Ihr Code Toast - Bis dahin ist es verdammt hart

Habe Spaß

1
Mark Mullin

Für die bidirektionale Verschlüsselung verwenden die meisten Algorithmen ein x oder einen Operator, der den Binärcode eines Schlüssels und die Binärdaten der Eingabe vergleicht. Dies ist dann möglicherweise nicht richtig für Sie, da Sie keinen Schlüssel verwenden können. Dies ist jedoch der Fall wie es funktioniert:

Eingabedaten: 10011101101001 Schlüssel: 123 = 1111011

Die Taste ist kleiner als die Eingabe, daher muss sie wiederholt werden:

Eingabedaten: 10011101101001 Schlüssel: 123 = 11110111111011

(in Java Verwenden Sie eine Variable, um in einer für jede oder eine while-Schleife alle Bits der Dateneingabe zu zählen ...) Verwenden Sie nun das x oder den Prinzipal, um das verschlüsselte Ergebnis zu generieren (zwei Way Hash) Schleife durch jedes Bit in den Eingabedaten und vergleiche es mit dem entsprechenden Bit im Schlüssel. Wenn identisch, addiere 0 zum Ergebnis, wenn nicht, addiere 1 zum Ergebnis ... Das Ergebnis ist dann:

Eingabedaten: 10011101101001 Schlüssel: 123 = 11110111111011 Ergebnis = 01101010010010

Um die Daten zu entschlüsseln, führen Sie einfach die verschlüsselten Daten aus:

Eingabedaten: 01101010010010 Schlüssel: 123 = 11110111111011 Ergebnis = 10011101101001

Idealerweise würden Sie eine Hash-Funktion wie sha, md5, ripemd usw. verwenden, um den Schlüssel zu generieren, und ihn dann in binär umwandeln. Wenn Sie keinen vorgefertigten Algorithmus verwenden können, können Sie Ihren eigenen Algorithmus erstellen, um den Schlüssel zu generieren verglichen werden ... stellen Sie einfach sicher, dass alle Bits in der Eingabe voneinander abhängig sind, um das Ergebnis zu generieren ... Beispiel:

passwort: abcdefghi abc = 123456789 (a = 1, b = 2, c = 3 usw.)

schleifen Sie nun jedes Bit (Ziffer) und addieren Sie sie mit einem Zähler. Beispiel: count = 0 result = "" für jede Ziffer im Passwort do {result = result & (Ziffer + result [count-1]) * count) count = count +1}

ergebnis = (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

schlüsselergebnis = 16152845669120153 Binär: 111001011000101110110101110100001110000011100010011001 (Dies ist ein sehr schlechtes Beispiel, du ... du solltest dir einen guten Algorithmus überlegen ... einen, bei dem die beiden Starteingänge kombiniert werden und den dritten bilden, und dann der dritte und vierte zusammen mit dem Ergebnis der ersten Kombination zur Erzeugung des fünften Ergebnisses ...)

aber wenn Sie keinen Schlüssel verwenden können, können Sie diesen nicht verwenden ...

1
Daniel V

Schauen Sie sich die Crypto I-Klasse der Stanford University auf coursera an. Es zerlegt Stream- und Block-Chiffren sowie die Verschlüsselung mit öffentlichen Schlüsseln. Sie wären viel besser informiert, wenn Sie nur die ersten Vorträge sehen würden. Darüber hinaus behandelt der Kurs auch Schwachstellen und Methoden zum Brechen von Krypto-Implementierungen.

0
Andrew