Arbitrary Length Integer
Verfasst: 10.10.2019 21:10
Hallo
Ich habe das Thema mit den 'beliebig langen Integerwerten' noch einmal angefasst und dafür eine DLL kompiliert.
Die DLL läuft mit x86 Programmen und enthält folgende Funktionen:
zzadd(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Addition (ret = Wert1 + Wert2)
zzsub(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Subtraktion
zzmul(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Multiplikation
zzdiv(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Division
zzrem(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Modulo
zzpom(ret.a, w1.p-ascii, e.p-ascii, w3.p-ascii) ; Potenzieren-Modulo x = w1^e % w3 (e kann auch negative sein)
zzgcd(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; ggT (größter gemeinsamer Teiler)
zzeea(rd.a, rs.a, rt.a, Wa.p-ascii, Wb.p-ascii) ; Extended Euclidean Algorithm d = gcd(a, b) = a*s + b*t
zzsqr(ret.a, Wert1.p-ascii) ; Quadrat ret = w1*w1
zzsro(ret.a, Wert1.p-ascii) ; Quadratwurzel ret = floor(a^{1/2}) (a >= 0)
zzpri(ret.a, len.l) ; Primzahl erzeugen
zznpr(ret.a, Wert1.p-ascii) ; nächsthöhere Primzahl ret = smallest prime >= w1. Uses ProbPrime with NumTrials.
zzpwr(ret.a, Wert1.p-ascii, e.l) ; Potenzieren x = a^e (e >= 0)
zzsee(Wert1.p-ascii) ; setzt den Startwert für zzrnd (Seed)
zzrnd(ret.a, len.l) ; Zufallszahl mit der Länge 2^len-1 erzeugen
zzcrt(ret1.a, ret2.a, Wert1.p-ascii, Wert2.p-ascii) ; Incrementaler Chinesischer Restsatz
zzrec(ret1.a, ret2.a, Wert1.p-ascii, Wert2.p-ascii, Wert3.p-ascii, Wert4.p-ascii) ; Rational Reconstruction
zzbtn(ret.a, byte.a, n.l) ; Byte to Number x = sum(byte*256^i, i=0..n-1) (byte[0] = LSB)
zzntb(ret.a, Wert1.p-ascii, n.l) ; Number to Byte
zzand(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; bitwise And
zzior(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; bitwise Or
zzxor(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; bitwise Xor
nbr.l = zznob(Wert1.p-ascii) ; Anzahl der Bits
nbr.l = zzham(Wert1.p-ascii) ; Hamming Gewicht (die Anzahl der von "0" verschiedenen Zeichen)
zzlsh(ret.a, Wert1.p-ascii, sh.l) ; links schieben
zzrsh(ret.a, Wert1.p-ascii, sh.l) ; rechts schieben (mit Nullen aufgefüllt - Vorzeichen bleibt erhalten)
Bei den Funktionen werden alle langen Integer in einem String an die DLL übergeben. Für das Ergebnis wird ein Pointer auf ein vorbereitetes Byte-Array (.a) übergeben. Das Array enthält nach der Berechnung das Ergebnis in Form eines Ascii-String bzw. der einzelnen Ziffern in den Feldern. Das Array muss vor der Nutzung komplett mit dem Wert "0" gefüllt sein (das ist der Fall, wenn es frisch angelegt wurde), sonst ist das Ende vom Ergebnis-String nicht erkennbar. Das Array muss mindestens so groß sein, wie die Anzahl der Stellen, die beim Ergebnis erwartet werden (+ 1 für den anschließenden 0-Wert).
Mit >> Ergebnis$ = PeekS(*ret, -1, #PB_Ascii) << erhält man wieder einen String zurück.
Um zu zeigen wie es funktioniert, habe dazu eine kleine Anwendung geschrieben die man hier herunterladen kann:
http://www.ralf-pagel.de/Kryptografiese ... erator.zip
Diese DLL darf jeder gerne für eigene Projekte nutzen.
Ich habe das Thema mit den 'beliebig langen Integerwerten' noch einmal angefasst und dafür eine DLL kompiliert.
Die DLL läuft mit x86 Programmen und enthält folgende Funktionen:
zzadd(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Addition (ret = Wert1 + Wert2)
zzsub(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Subtraktion
zzmul(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Multiplikation
zzdiv(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Division
zzrem(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; Modulo
zzpom(ret.a, w1.p-ascii, e.p-ascii, w3.p-ascii) ; Potenzieren-Modulo x = w1^e % w3 (e kann auch negative sein)
zzgcd(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; ggT (größter gemeinsamer Teiler)
zzeea(rd.a, rs.a, rt.a, Wa.p-ascii, Wb.p-ascii) ; Extended Euclidean Algorithm d = gcd(a, b) = a*s + b*t
zzsqr(ret.a, Wert1.p-ascii) ; Quadrat ret = w1*w1
zzsro(ret.a, Wert1.p-ascii) ; Quadratwurzel ret = floor(a^{1/2}) (a >= 0)
zzpri(ret.a, len.l) ; Primzahl erzeugen
zznpr(ret.a, Wert1.p-ascii) ; nächsthöhere Primzahl ret = smallest prime >= w1. Uses ProbPrime with NumTrials.
zzpwr(ret.a, Wert1.p-ascii, e.l) ; Potenzieren x = a^e (e >= 0)
zzsee(Wert1.p-ascii) ; setzt den Startwert für zzrnd (Seed)
zzrnd(ret.a, len.l) ; Zufallszahl mit der Länge 2^len-1 erzeugen
zzcrt(ret1.a, ret2.a, Wert1.p-ascii, Wert2.p-ascii) ; Incrementaler Chinesischer Restsatz
zzrec(ret1.a, ret2.a, Wert1.p-ascii, Wert2.p-ascii, Wert3.p-ascii, Wert4.p-ascii) ; Rational Reconstruction
zzbtn(ret.a, byte.a, n.l) ; Byte to Number x = sum(byte*256^i, i=0..n-1) (byte[0] = LSB)
zzntb(ret.a, Wert1.p-ascii, n.l) ; Number to Byte
zzand(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; bitwise And
zzior(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; bitwise Or
zzxor(ret.a, Wert1.p-ascii, Wert2.p-ascii) ; bitwise Xor
nbr.l = zznob(Wert1.p-ascii) ; Anzahl der Bits
nbr.l = zzham(Wert1.p-ascii) ; Hamming Gewicht (die Anzahl der von "0" verschiedenen Zeichen)
zzlsh(ret.a, Wert1.p-ascii, sh.l) ; links schieben
zzrsh(ret.a, Wert1.p-ascii, sh.l) ; rechts schieben (mit Nullen aufgefüllt - Vorzeichen bleibt erhalten)
Bei den Funktionen werden alle langen Integer in einem String an die DLL übergeben. Für das Ergebnis wird ein Pointer auf ein vorbereitetes Byte-Array (.a) übergeben. Das Array enthält nach der Berechnung das Ergebnis in Form eines Ascii-String bzw. der einzelnen Ziffern in den Feldern. Das Array muss vor der Nutzung komplett mit dem Wert "0" gefüllt sein (das ist der Fall, wenn es frisch angelegt wurde), sonst ist das Ende vom Ergebnis-String nicht erkennbar. Das Array muss mindestens so groß sein, wie die Anzahl der Stellen, die beim Ergebnis erwartet werden (+ 1 für den anschließenden 0-Wert).
Mit >> Ergebnis$ = PeekS(*ret, -1, #PB_Ascii) << erhält man wieder einen String zurück.
Um zu zeigen wie es funktioniert, habe dazu eine kleine Anwendung geschrieben die man hier herunterladen kann:
http://www.ralf-pagel.de/Kryptografiese ... erator.zip
Diese DLL darf jeder gerne für eigene Projekte nutzen.