![]() |
Public-Key ... schnelle Exponention
Abend Allerseits,
kann mir jemand, der schon mal die sog. "schnelle Exponention" programmiert hat, wie man sie z. B. für Cryptprogramme braucht (also Public-Key-Verfahren (RSA)), verraten, wie er das getan hat. Ist auch bekannt unter fortlaufende Exponention, um zum Beispiel folgende Rechnung a^123.390.234 mod n = x zu lösen. Als Delphi-Code sähe das so aus, nur mag er das nicht:
Delphi-Quellcode:
Danke! :thuimb:
x := IntPower(a,123.390.234) mod n;
MfG Meisterschmied |
Re: Public-Key ... schnelle Exponention
Lass mal die 3er-Trennzeichen (Punkte) weg :wink:
|
Re: Public-Key ... schnelle Exponention
Danke, isses aber gar nicht. Hast zwar recht, aber der Code war jetzt gerad nur hingeschludert :P War ja nur ein Beispiel, für das was ich meine. Trotzdem die Änderung:
Delphi-Quellcode:
:bounce1:
x := IntPower(5,129384921) mod n;
|
Re: Public-Key ... schnelle Exponention
Man nimmt dazu die Binäre Exponentation, genauer gesagt die binäre Expansion des Exponenten zu Hilfe. Stelle dir den Exponenten als Binärzahl vor, zb. 11 = 01011b.
Dieses Binärzahl ist 4 bits groß wir benötigen also 3 mal modulare Quadrierung + 2 mal eine modulare Multiplikation. Es gibt nun eine Binäre Exponentation die die Bits des Exponenten von Links nach Rechts abarbeitet, also die Linksorientiere Binäre Exponentation und eine die von Rechts nach Links vorgeht. 2^11 sähe also so aus:
Code:
Der Schritt 0. ist die Initialization, und Schritte 1-3 sind die Exponentations Schleife die das Höchste Bit des Exponenten nicht mehr berücksichtigt. Sie geht also vom 2. höchsten Bit des Exponenten runter bis auf Bit 0. In Schritt 5. enthält T das Resultat.
Bit 3210
2 ^ 1011b Base = B = 2 Exponent = 1011b 0.) T = B da Bit 3 = 1, ist immer 1 1.) T = T^2 -> 2^2 da Bit 2 = 0 nichts weiter 2.) T = T^2 -> (2^2)^2 da Bit 1 = 1 somit T := T * B -> (2^2)^2 * 2 3.) T = T^2 -> ((2^2)^2 * 2)^2 da Bit 0 = 1 somit T := T * B -> ((2^2)^2 * 2)^2 * 2 5.) T = ((B^2)^2 * B)^2 * B = 2^11 = 2048 Dies wäre die binäre Exponentation, um sie modular zu machen muß nur jede Operation, sprich Quadrierung T := T^2 und T := T * B modular arbeiten also T := T^2 mod N und T := T * B mod N. Es gibt nun verschiedene Ansätze wie man die Anzahl der Quadrierungen und Multiplikationen bei langen Exponenten verringern kann, d.h. diese Berechnung beschleunigt. Denn bei RSA arbeitet man ja mit Modulen die ca. 1024 Bit groß sind, d.h. Exponenten mit 1024 Bit. Man benötigt also im Durchschnitt 1024 mal modulare Quadierungen und ca. 512 mal modulare Multiplikationen pro Modulare Exponentation. Die erste Optimierung ist der Montgomery Trick. Statt als die "mod" Operation als Divisionsalgorithmus zu coden, der langsam ist, wird in der Montgomery Domain diese durch Multiplikationen ersetzt. Die zweite Optimierung ist es den Exponenten nicht Bit für Bit abzuarbeiten, sondern zB. 2 Bits des Expotenten mit einmal abzuarbeiten. Um dies zu können benötigt man eine Tabelle mit allen vorberechneten Exponenten für die Bits 00,01,10,11 also 4 vorberechnete Werte. Dies benötigt 3 Quadrierungen und 2 Multiplikationen. Die Exponentationsschleife arbeitet nun 2 Bits mit einmal ab. Statt 1024 Quadrierungen + 512 Multiplikationen, werden also nur noch 1027 Quadierungen und 258 Multiplikationen benötigt. Eine Quadrierung kann wenn sie clever programmiert wurde ca. 1.5 mal schneller sein als eine Multiplikation. Man könnte statt 2 Bits auch 4 Bits benutzen. Diese Technik nennt sich dann "x Bit Sliding Window" Technik. Es gibt noch viele andere Verfahren. Eine weitere Optimierung bei RSA von Faktor 4 mal schneller gibt es bei der Entschlüsselung. Statt M := C^D mod N , also Orginalmessage := CipherMessage^DecryptionExponent mod Modulus zu rechnen wird das "Chinese Remainder Theorem" sprich der Chinesische Restesatz angewendet. Dazu benötigt man aber bestimmte Vorberechnungen, eben die Primzahlen P,Q die N = P * Q bilden und noch einige andere Werte. Durch das CRT wird dann alles 4 mal beschleunigt. Gruß Hagen |
Re: Public-Key ... schnelle Exponention
Danke, das war ja schon recht eindeutig. Aber wie zählst du die Bits in deinem Code (3. Bit = 1?) und warum ist der Exponent 1011b? Und noch mal kurz zum Verständnis: Egal ob das Bit 0 oder 1 ist, T wird bei jedem Schritt quadriert, dagegen wird T auch noch verdoppelt, wenn das Bit 1 ist, bzw. es bleibt so wie es ist, wenn das Bit 0 ist. Richtig?
Vielen Dank übrigens für die ausführliche Antwort :zwinker: . Is hier echt das beste Forum, was ich kenne :dp: Thanks, :roll: Meisterschmied |
Re: Public-Key ... schnelle Exponention
Zitat:
Zitat:
Zitat:
Zitat:
Ganz wichtig ist es, und das meine ich nicht abwertend oder überheblich, für solche Programmierungen zu wissen was der Computer und der Algorithmus macht. Du musst dir also unbedingt bestimmtes Grundlagenwissen aneigenen. Dazu empfehle ich dir das Buch "Handbook of Applied Cryptography" von Menezes, van Oorschot, Vanstone ISBN 0-8493-8523-7. Man könnte auch auf Donald Knuths Standardwerk "The Art of Computer Programming" Kapitel 4 "Arithmetic" hinweisen, ich persönlich finde es aber nicht ausreichend und veraltet. Trotzdem will ich's hier nicht verschweigen, da öfters an anderen Stellen darauf hingewiesen wird. Gruß Hagen |
Re: Public-Key ... schnelle Exponention
Danke! Ich sehe, es gibt noch viel zu tun :-D Ist doch zumindest schon mal ein Ansatzpunkt. Auf jeden Fall besten Dank, werd mich mal weiter umgucken. Hört sich recht vielversprechend an :wink:
Danke, das du dir die Zeit genommen hast :thuimb: . Beste Grüße, Meisterschmied |
Re: Public-Key ... schnelle Exponention
Eines noch, entscheidend ist es das bei der Modularen Exponentation bei jedem Zwischenschritt sofort modular reduziert wird. Einfach IntPower(2, $1234567890ABCDEF) mod N kann nicht funktionieren da
1.) 2^$1234567890ABCDEF gerechnet wird und 2.) erst dann mod N reduziert wird. Der 1. Schritt würde eine so große Zahl erzeugen das sie nicht mehr exakt in einer Fließkommazahl darstellbar ist. Bei der Implementation von RSA wird aber eine auf's Bit genaue Berechnung benötigt. Fließkommazahlen sind als schwachsinnig für eine RSA Berechnung. Desweiteren sollte der Modulus N ca. 1024 Bits haben, sprich ca. 2^1024 groß sein, nur dann kann man RSA als technisch sicher bezeichnen. Da der Exponent bestenfalls zufälig gewählt wurde hiese dies das selbst dieser ca. 1024 Bit groß ist. Mit IntPower() oder den Delphi Bordmitteln kann man also kein RSA umsetzen. Gruß hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz