it-swarm-eu.dev

Gibt es ein einfaches Beispiel für eine asymmetrische Verschlüsselungs- / Entschlüsselungsroutine?

Ich kann Java-, Perl- und JavaScript-Code sehr gut verstehen. Den Rest habe ich nicht studiert, aber ich denke, ich könnte herausfinden, wie man liest/übersetzt.

Ich würde gerne wissen, was die einfachste asymmetrische Routine ist. Ist es wirklich zu komplex, um sich Sorgen machen zu wollen?

Ich bin nur sehr gespannt, wie es möglich ist, einen Nur-Verschlüsselungsschlüssel zu haben! Es scheint mir einfach erstaunlich, dass es dem Reverse Engineering widerstehen kann, also möchte ich wissen, wie es funktioniert!

  1. Ist es dafür zu kompliziert?.
  2. Was ist (eine) der einfachsten Standard-Asymmetric-Verschlüsselungsroutinen, nach denen ich eine Implementierung suchen kann?
  3. Wenn Sie minimale Codebeispiele haben, wäre das nett.

Ich habe bereits die Wikipedia-Absätze zur Funktionsweise überprüft, aber es gab keine mathematische Aufschlüsselung oder Beschreibung der Implementierung, nur viele Implementierungen . Ich wollte nicht wirklich zufällig auswählen, welches ich mir ansehen möchte, und ich wollte auch nicht das häufigste nehmen, von dem ich erwarte, dass es am robustesten und kompliziertesten ist.

Irgendwelche Gedanken?

11
Bryan Field

Gutschrift geht an Jeffs Antwort für die Details und Steves Antwort was auch hilfreich war. Der Kredit geht auch an tylerls Antwort , der Links zu Wikipedia für alle Funktionen enthielt, insbesondere modInverse , und es wurde auch der mehrdeutige Ausgangspunkt für e. Vielen Dank, Ich habe Ihre Antworten positiv bewertet und anhand der kombinierten Informationen aus allen drei Antworten eine hoffentlich bessere Antwort erstellt.

Der Schlüssel, um Reverse Engineering so teuer zu machen, ist die Verwendung von Power-of . Quadratwurzel ist nicht so schwer, Potenz von 3 bedeutet, dass Sie eine gewürfelte Wurzel benötigen, aber Potenz von 34.051.489 ist ziemlich hart. Es gibt andere mathematische Operationen, die sich nur schwer rückentwickeln lassen. Es gibt auch mehrere Möglichkeiten, einen asymmetrischen Algorithmus zu erstellen. Diese Antwort konzentriert sich jedoch auf RSA. Das älteste und häufigste.

RSA-Algorithmus (basierend auf der Java Code )

Die folgenden Berechnungen sollten mit Ganzzahlen mit beliebiger Genauigkeit durchgeführt werden. (Wie BigInt oder BigInteger)

Generieren der Schlüssel:

  • Die konstante Schlüssellänge ist l.
  • Normalerweise kann die Konstante e_start Der Einfachheit halber =3. 0x10001 Ist jedoch häufiger, auf jeden Fall ist eine Primzahl am besten (aus Gründen der Leistung bei der Schlüsselgenerierung und wahrscheinlich aus anderen Gründen).
  • p und q sind die zufällig generierten positiven Primzahlen, für deren Speicherung bis zu l Bits erforderlich sind. (Um diese positiv zu halten, ist das erste Bit immer 0)
  • n = p*q Dies wird sowohl für die Verschlüsselung als auch für die Entschlüsselung verwendet.
  • e beginnt als e_start. Dies wird schließlich der Teil des Verschlüsselungsschlüssels sein.
  • m = (p-1)*(q-1) wird verwendet, um e in d zu konvertieren, das zur Entschlüsselung verwendet wird.
  • while(gcd(e,m)>1){e+=2} Dies ist erforderlich, damit der nächste Schritt funktioniert.
  • d=modInverse(e,m) Dies führt eine arithmatische Standardoperation aus. Wahrscheinlich nicht wert, viel untersucht zu werden, besonders wenn Ihre Programmiersprache dies eingebaut hat

Um zu verschlüsseln oder zu entschlüsseln, konvertieren Sie zuerst Ihre Bytes in eine einzelne Ganzzahl mit beliebiger Genauigkeit.

Verschlüsselung: encrypted=(plain^e)%n

Hinweis: Wenn plain>=n, Müssen Sie plain in zwei oder mehr kleinere Werte aufteilen und diese separat verschlüsseln.

Entschlüsselung: plain=(encrypted^d)%n

Asymmetrische Verschlüsselung ist normalerweise weniger effizient als symmetrische Verschlüsselung. Manchmal wird die asymmetrische Verschlüsselung nur für den Schlüsselaustausch verwendet.

6
Bryan Field

In Bezug auf RSA bietet this ein gutes Beispiel, das befolgt werden kann, und zeigt entsprechende Beispiele für Eingabe und Ausgabe. Diese Demo Anwendung führt Sie durch die verschiedenen Schritte und ermöglicht es Ihnen, die Arbeit zu überprüfen. Manchmal hilft es, wenn Sie sich in solchen Schritten durch etwas klicken. Für Wikipedia-Artikel müssen Sie sich den eigentlichen Algorithmusartikel ansehen: RSA für die entsprechende Mathematik.

In Bezug auf die Implementierung können Sie dies in Java in nter 30 Zeilen klar zusammenfassen.

Nach Ihrem Verständnis gibt es keinen Nur-Verschlüsselungsschlüssel. Vielmehr gibt es zwei gleiche Schlüssel, die die Operationen ihrer Partner umkehren. Wir weisen willkürlich eines der Paare als privat und eines als öffentlich zu. Mit einem Schlüssel verschlüsselte Dinge können mit dem anderen Schlüssel entschlüsselt werden. Dies ist das Prinzip, das beim Signieren verwendet wird.

Es handelt sich nicht um ein Anti-Reverse-Engineering-Problem, das die Schlüssel sicher macht, sondern um ein mathematisches Konzept, bei dem Sie den massiven Schlüsselraum (wenn der Schlüssel einen sehr großen Zahlenraum verwendet) nicht angemessen überprüfen können, um den passenden Schlüssel zu finden. Es gibt keine wirkliche Beschleunigung für die Factoring-Arbeit.

Es gibt andere asymmetrische Schlüsselalgorithmen zu lernen, aber wenn Sie herausstarren, würde ich versuchen, zuerst RSA, den ältesten und gebräuchlichsten, zu verstehen.

13
Jeff Ferland

Ich habe eine Demonstration von RSA mit python (Python ist sehr einfach zu lesen, auch wenn Sie es noch nie gesehen haben) zusammengestellt. Der Code ist lang genug, dass er nicht auf einen passt Seite, aber kurz genug, dass Sie es in wenigen Minuten lesen und verstehen können.

Da die Verschlüsselung/Entschlüsselung in einem einzigen integrierten Befehl durchgeführt werden kann - exp(PLAINTEXT,KEY,MODULUS) -, gehe ich auch den gesamten Prozess der Schlüsselableitung durch.

Den Code finden Sie hier: https://Gist.github.com/1239116

Wenn Sie den Code ausführen, werden Sie aufgefordert, Eingaben in Form von >12345 oder <12345, bei dem die > Präfix weist es an, einen privaten Schlüssel auf die Nummer anzuwenden, während < weist es an, den öffentlichen Schlüssel anzuwenden. Der Einfachheit halber werden nur Zahlen codiert. Sobald Sie das haben, ist das Codieren beliebiger Daten nur eine Frage der Formatierung.

6
tylerl

Eigentlich ist die Mathematik ziemlich einfach, so wie ich es verstehe. Sie nehmen einen Wert hoch einer unglaublich großen Primzahl (Tausende von Ziffern) und machen einen Mod von einer anderen Zahl.

Zum Verschlüsseln haben Sie also Folgendes: EncryptedBits = (PlainText ^ YourPublicKey)% Modulus

Und zum Entschlüsseln haben Sie so etwas wie: PlainText = (EncryptedBits ^ YourPrivateKey)% Modulus

Ich bin hier auf ein ziemlich einfach zu lesendes Dokument gestoßen: http://mathaware.org/mam/06/Kaliski.pdf

Ich bin mir jedoch nicht sicher, welche Bibliotheken ich mir ansehen soll.

5
Steve

Wenn Sie eine niedliche, minimale Perl-Lösung suchen, gibt es eine klassische von Adam Back aus 1995 :

Es wurde auf ein T-Shirt gedruckt, einschließlich eines Barcodes, um es computerlesbar zu machen, zusammen mit der Aussage " Dieses T-Shirt ist eine Munition " . Diese Aussage war in den USA zutreffend, bevor eine starke Kryptographie 1996 neu klassifiziert keine technische "Munition" mehr war. Es war jedoch noch weitgehend illegal, starke Kryptografie aus den USA zu exportieren, bis die Export Administration Regulations (EAR) überarbeitet im Jahr 20 :

Die Software wurde auch als Tätowierung, E-Mail-Signatur, Versandetikett und in vielen anderen Formen verbreitet und erschien sogar (in unscharfer Form) in der New York Times (dem Artikel ohne Foto, ist online unter Zwischen einem Hacker und einem harten Ort ). Eine neuere 2-Zeilen-Version ist:

print pack"C*",split/\D+/,`echo "16iII*o\[email protected]{$/=$z;[(pop,pop,unpack"H*",<>
)]}\EsMsKsN0[lN*1lK[d2%Sa2/d0<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<J]dsJxp"|dc`

Beachten Sie, dass der ursprüngliche Ansatz für die Arithmetik mit beliebiger Genauigkeit auf dem Unix-Programm "dc" basiert. Eine reine Perl-Version mit Anmerkungen ist bei

2
nealmcb