[VB/RSA(ct25/99]ÜBERLAUF-Fehler]Datentyp>double

Hallo Leute. Einige von euch haben bestimmt die Kurzgeschichte mit den 2 Schwestern aus der ct 25/99. Ich habe ein Entschlüssellungsprogramm gemäß dem vorgestellten Alg. in VB implementiert. Er funktioniert auch wunderbar. Das dekodieren des Satzes ICH BIN BIANCA führt aber zu folgendem Fehler

[…e as double, q as double]

(e=8, exp=27)

q=e hoch exp
(q=… mal 10 hoch 15 --> kein Fehler)
e = q mod 51 (–>ÜBERLAUF)

Aber wieso? die resultierende Zahl muß doch kleiner als q sein und noch in den Wertebereich passen.
(Ich weiß nicht mehr genau, ob die Zahlen auf das Beispiel passen, weil ich die ct grad nicht zur Hand habe, aber das macht ja keinen Unterschied. Tendenziell stimmts.)

Gibt es in VB einen Datentyp der größere Zahlen speichern kann als double?

cu, Holli

Hallo,

obwohl ich kein VB-Programmierer bin, sondern eher der Pascal/Delphi-Ecke angehöre, versuche ich mich mal trotzdem an einer Antwort.

[…e as double, q as double]

Ich gehe davon aus, daß „double“ ein Gleitkommatyp ist. e und q haben deshalb einen Wertebereich von wahrscheinlich 5*10^-324 bis 1.7*10^308 (wenn der VB-Typ „Double“ gleich dem Delphi-Typ „Double“ ist; wenn er gleich dem Delphi-Typ „Single“ ist, dann ist der Wertebereich 1.5*10^-45 bis 3.4*10^38).

(e=8, exp=27)
q=e hoch exp

8^27 = 2.41785…*10^24 laut Taschenrechner.
==> q kann diesen Wert auf jeden Fall aufnehmen.

(q=… mal 10 hoch 15 --> kein Fehler)

Macht Sinn.

e = q mod 51 (–>ÜBERLAUF)

Vorsicht: Die Modulo-Funktion ist nur für Ganzzahl-Typen definiert! Der Delphi-Compiler würde daher „q mod 51“ gar nicht akzeptieren. Da der VB-Compiler das offensichtlich nicht beanstandet, kann ich nur den Schluß ziehen, daß q vor dem Anwenden von „mod 51“ automatisch in eine Ganzzahl-Variable konvertiert wird. Und wenn das so ist, dann wird der Überlauf-Fehler verständlich, denn der größte mir bekannte Ganzzahl-Typ „LONGINT“ (32 Bit) reicht „nur“ bis 2147483647 = 2.147…*10^9.

Gruß
Martin

Das klingt schlüssig. Aber wie ermittele ich den Rest wenn den der Modulo-operator nicht funktioniert?

Folgendes:

e = q - ( ganz(q/151) * 151 )

ergibt eine gebrochene Zahl, obwohl alle beteiligten zahlen ganzzahlen sind.

cu, Holli

Hallo!

Habe die Geschichte mittlerweile auch gelesen. Also - sowohl der Ver- als auch der Entschlüsselungsprozeß beruhen ausschließlich auf Manipulationen ganzer (und eventuell großer) Zahlen. Das heißt: Die Implementierung der Algorithmen muß mit Ganzzahl-Typen erfolgen. Da die Zahlen groß werden können, solltest Du alle Variablen als 32-Bit-Ganzzahlen deklarieren (VB stellt diesen Typ mit Sicherheit bereit, aber ich weiß nicht, wie er dort heißt; in Delphi heißt er „LONGINT“). Diese Variablen können dann Werte bis maximal 2147483647 aufnehmen. Für Ergebnisse aus der Operation „Potenzierung“, die ja im Zuge der Ver- und Entschlüsselung angewendet wird, ist das nicht sooo viel. Damit es zu keinem Überlauf kommt, müssen die vorkommenden Exponenten daher hinreichend klein sein. Die Verwendung von Gleitkommatypen ist dagegen KEIN Ausweg, obwohl diese bedeutend größere Werte darstellen können. Der Grund in der, daß Gleitkommatypen nur Informationen über eine „kleine“ Anzahl an Stellen beinhalten (bis höchstens etwa 15 bei „DOUBLE“-Typen in Delphi). Es sind also immer mehr oder weniger der „letzten“ Stellen bei Gleitkommatypen unbestimmt, beispielsweise ist „2.56475803948192E24“ NICHT als 256475803948192000000000 zu interpretieren, sondern als 256475803948192??? ("?" = an dieser Stelle steht eine Ziffer von 0…9, aber welche, ist offen). Das Ergebnis einer Modulo-Operation hängt aber von ALLEN Stellen ab - genau das ist nämlich gerade ihre Spezialität!

Fazit also: Verwendung der „größten“ verfügbaren Ganzzahl-Typen plus Beschränkung auf „kleine“ Exponenten. Der in der Story vorkommende Exponent 11 ist gerade so an der Grenze: Die Berechnung von (1647 MOD 51)^11 = 15^11 ist noch möglich, (741 MOD 51)^11 = 27^11 führt dagegen zum Überlauf.

Nun ist auch verständlich, warum der Hauptmodul 681 am Ende der Geschichte auf auf einen ganz kleinen Entschlüsselungsexponenten führt.

Gruß
Martin

Dankefür deine ausfürhlichen Antworten. Leute wie dich braucht man im Netz. Ich hoffe, ich kann dir auch mal helfen. Zögere nicht mich anzumailen (was für ein wort).

cu, Holli