Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Berechnungen mit großen Zahlen


Markus696 - Do 06.02.14 18:04
Titel: Berechnungen mit großen Zahlen
Hallo,

für ein Schulprojekt muss ich ein Programm entwerfen, welches in der Lage ist eine Information mittels des RSA-Verfahrens zu verschlüsseln. Das Projekt ist theoretisch fertig, bloß in der Praxis scheitert es leider.

Ich muss Berechnungen wie etwa 202122222324252226^64869761 mod 1607202089 vornehmen können und das löst leider immer einen Error aus. Die einziges Nachricht die ich verschlüsseln kann ist 1, denn 1 ist RSA-Verschlüsselt ja immernoch 1 ^^ Sonst liegen alle Berechnungen für mich außerhalb des möglichen. Das ist auch das erste Mal, dass ich beim programmieren mit Zahlen dieser Größenordnung in kontakt komme, folglich fällt es mir sehr schwer damit umzugehen. Kann mir jemand helfen? Ich bitte darum.

Mit freundlichen Grüßen
Markus


ub60 - Do 06.02.14 18:21

in Delphi:
http://www.entwickler-ecke.de/viewtopic.php?t=83402&highlight=bignum

Allgemein:
http://johann.loefflmann.net/de/software/bigal/

Viel Erfolg!
ub60


Markus696 - Do 06.02.14 19:42

Vielen Dank für die Hilfe! Ich habe mir die BigNum2.pas heruntergeladen und bei uses eingebunden, sowie die entsprechend benötigten Funktionen BM_Power und BM_Modulo zur Berechnung der Verschlüsselung benutzt. Nun bekomme ich leider einen Error aus der BigNum2-Unit, mit dem ich als Laie so gar nichts anfangen kann :(


Lelf - Do 06.02.14 19:55

Hallo Markus696,

Du mußt die Function
BM_PowerMod(Base, Exp, Module: TBigNumber): TBigNumber;
verwenden.

Gruß Lelf


Markus696 - Do 06.02.14 20:07

Danke, das habe ich geändert. Der Error bleibt aber leider derselbe. :(


Martok - Do 06.02.14 20:27

Moin und :welcome:!

Das liegt daran, dass das optimierter 32bit-Assembler ist, du aber vermutlich für eine andere Plattform compilierst. Einfachster Fix: stell das unter Projekt->Projekteinstellungen auf i386 um.
user defined image

EDIT: man sagt mir grade, dass der 32bit-Compiler dann auch separat installiert und konfiguriert sein muss.
Ist aber an der Stelle egal, du kannst die komplette Funktion Int64divModCar einfach auskommentieren/rauslöschen, soweit ich sehe wird die nirgendwo benutzt.

Grüße,
Martok


Delphi-Laie - Fr 07.02.14 00:08

Markus bzw. Markus696, schau Dir mein Programm "Langzahlentaschenrechner" (auch in diesem Forum zu finden) an, in das habe ich derzeit 8 (soweit ich mich erinnere) verschiedene pascalbasierte Langzahlenbibliotheken integriert. Es sollen noch welche hinzukommen, nur zur Zeit liegt das Projekt brach, wird aber mittelfristig wieder aufgenommen werden.

Auch bignum (genaugenommen bignum2) habe ich dort erfolgreich integriert, allerdings sehr wenige Korrekturen (oder nur eine?) daran vorgenommen. Um eigene Funktionen ergänzt habe ich allerdings alle Langzahlenbibliotheken.


Gammatester - Fr 07.02.14 10:00

user profile iconMarkus696 hat folgendes geschrieben Zum zitierten Posting springen:
Danke, das habe ich geändert. Der Error bleibt aber leider derselbe. :(
In meinem MPArith-Paket [http://www.wolfgang-ehrhardt.de/misc_de.html#mparith] (open source freeware) findest Du eine RSA-Unit mit standardisierten und getesten RSA-Funktionen [http://www.wolfgang-ehrhardt.de/mp_intro.html#rsa_functions]. Neben den Tests sind im Archiv supptest.zip noch 6 RSA-Beispielprogramme, die RSA-Anwendung und -Attacken demonstieren.


Tranx - Fr 07.02.14 10:52

user profile iconMarkus696 hat folgendes geschrieben Zum zitierten Posting springen:


202122222324252226^64869761



Wow, das muss ja schon eine Zahl sein, die selber schon 1.122.611.048 Ziffern hat. Die dann noch modular durch 1.607.202.089 zu teilen, echt, wie lange rechnet selbst ein PC eigentlich daran?


Xion - Fr 07.02.14 11:24

Es gibt deshalb bessere Verfahren dafür
z.B: http://www.gm.fh-koeln.de/~konen/DisMa/Erg03_DisMa.pdf

Damit sollte man ganze ohne bignum auskommen und es ist vermutlich fies schnell.


Martok - Fr 07.02.14 11:28

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Wow, das muss ja schon eine Zahl sein, die selber schon 1.122.611.048 Ziffern hat. Die dann noch modular durch 1.607.202.089 zu teilen, echt, wie lange rechnet selbst ein PC eigentlich daran?
Mit Mathematica nicht messbar, modulare Arithmetik hat ein paar nette Eigenschaften und nur deswegen funktioniert RSA überhaupt sinnvoll ;)

Quelltext
1:
2:
3:
In[3]:= AbsoluteTiming[PowerMod[202122222324252226, 64869761, 1607202089]]

Out[3]= {0., 1357487496}


user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Damit sollte man ganze ohne bignum auskommen und es ist vermutlich fies schnell.
Deswegen sollte man auch bei BigNum2 die PowerMod-Funktion direkt verwenden, die direkt auf dem passenden Ring potenziert.

Nicht immer hat man ja so kleine Zahlen wie hier ;)


Gammatester - Fr 07.02.14 11:56

Mit dem MPArith-Rechner ist die Zeit (incl. parsing) gerade noch meßbar:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
D:\Xtools\MPArith>t_calc.exe
T_CALC using MPArith V1.27.01 (31/32 bit) [mp_calc]  (c) W.Ehrhardt 2006-2013
Karatsuba cutoffs:  mul/sqr = 16/32,   Toom-3 cutoffs: mul/sqr = 32/64
Burnikel/Ziegler div cutoff = 32,   MaxBit = 520093696,   MaxFact = 22623931
Type "?<enter>" to get some info about commands, "\q" or "quit" to end.

[D]:=> 202122222324252226^64869761 mod 1607202089
Result = 1357487496
[D]:=> .
Time = 0.145 ms
Selbstverständlich rechnet (wie user profile iconMartok schon sagte) man nicht erst die riesige Potenz aus, sondern benutzt sowas wie die schnelle Binäre modulare Exponentiation [http://de.wikipedia.org/wiki/Bin%C3%A4re_Exponentiation#Bin.C3.A4re_modulo-Exponentiation].


Markus696 - Fr 14.02.14 23:53

Vielen Dank, ich hab das Problem jetzt mittels der Moduloexponentation gelöst. Nun hat sich bloß ein weiteres im Zusammenhang mit der Umwandlung eines Strings in ein array of integer (ein feld für jedes char) ergeben. Ich habe dazu folgendes formuliert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type

  array_of_int = array of integer; 

var
  intfeld: array_of_int; 

procedure Trsa.b_textzASCIIClick(Sender: TObject);
var txt: string; i: integer;
begin
  txt:= m_klartext.text;
  for i:=1 to length(text) do
      intfeld[ ( i - 1 ) ]:= ord( txt[i] );
end;


Ich bekomme beim Aufruf der Button-Prozedur immer eine Exception, kann aber beileibe meinen eigenen Denkfehler nicht finden. Gehört nicht mehr ganz zum Thema, aber immernoch zum selben projekt, deswegen stelle ich die Frage hier. Weiß jemand Rat? (External: SIGSEGV)

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


mandras - Sa 15.02.14 02:44

Du mußt vorher die Länge des Feldes festlegen mittels setlength würde ich auf die Schnelle tippen