while-schleife funzt nicht Java 

Status
Für weitere Antworten geschlossen.

Funk

Registered +
Registriert
Apr. 2004
Beiträge
1.565
Hey Jungs,

bin gerade dabei nen RSA-Algorithmus zu implementieren und sehe grad bei eine while-schleife den Fehler nicht, bekomme aber ständig illegal start of expression ausgegeben:

Code:
while (v.gcd(k)).equals(BigInteger.ONE == false))
{
k = BigInteger.probablePrime (31, rng);
}

Kann auch gut sein, dass irgendwas untereinander nicht passt.
 
Dazu brauchen wir ein paar mehr infos...
was ist v, was ist k?

Deine Klammerung ist definitiv falsch...
Ohne den rest zu kennen kann ich aber nur raten...

Code:
while (v.gcd(k).equals(BigInteger.ONE) == false)
{
k = BigInteger.probablePrime (31, rng);
}

So ist die Klammerung korrekt, aber obs so aussehen soll kann ich dir nicht sagen ;)
 
Zuletzt bearbeitet von einem Moderator:
ok, war anscheinend nur die Klammer :confused:

das ist der code

public BigInteger gibSchlüssel()
{
p = BigInteger.probablePrime (32, rng);
q = BigInteger.probablePrime (32, rng);
BigInteger n = p.multiply(q);
BigInteger v = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
k = BigInteger.probablePrime (31, rng);
while (v.gcd(k).equals(BigInteger.ONE) == false)
{
k = BigInteger.probablePrime (31, rng);
}
return p;
}

jetzt wollte ich einfach mal zum testen p rausgeben, aber ich bekomme da irgendwie nichts zurück bei bluej. Kann das mal einer eben testen? p soll ja ne zufällig gewählte primzahl sein. Der Parameter rng ist n Objekt aus der Klasse Random.
 
Bei mir funktioniert der Schnipsel, poste doch mal mehr, du kannst eigentlich nur bei der Ausgabe einen Fehler gemacht haben.

ps: Umlaute im Quellcode = böse ;)
 
Code:
import java.math.BigInteger;
import java.util.Random;

public class RSAAlgorithmus
{

Random rng;
BigInteger p;
BigInteger q;
BigInteger k;



public RSAAlgorithmus()
{
rng = new Random();
p = BigInteger.probablePrime (32, rng);
q = BigInteger.probablePrime (32, rng);
}


public BigInteger gibSchluessel()
{
p = BigInteger.probablePrime (32, rng);
q = BigInteger.probablePrime (32, rng);
BigInteger n = p.multiply(q);
BigInteger v = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
k = BigInteger.probablePrime (31, rng);
while (v.gcd(k).equals(BigInteger.ONE) == false)
{
k = BigInteger.probablePrime (31, rng);
}
return p;
}

Hier bitte. Bin aber noch nicht fertig, wollt nur wissen, ob es bis dahin so korrekt ist.

Welche Zahlen hast du denn rausbekommen ? Wirklich Primzahlen und in welchem Bereich ? Bin übrigens über jede Anmerkung dankbar, sei es programmiertechnisch, formal etc. ganz egal :)
 
Jop, stimmt so. Das einzige was mir noch auffällt, das rng = new Random() gehört, sowie ich das bis hierhin sehen kann, in die gibSchluessel(). Und ist es Absicht, dass du im ganzen Code dieselbe Zufallszahl verwendest?

Als Ausgabe bekomme ich solche Zahlen:

3499734283
3423084389
2188715387
2785491601
4185974519
4214936389
 
Hab jetzt nicht genau verstanden was du meinst, aber bekommst du dann für p und q diesselbe Zahl raus ?

Wenn ja, dann müsste ich zwei Objekte von Random erstellen oder ?

Übrigens, wenn ich jetzt noch am ende return q; hinzufüge bekomme ich ne Fehlermeldung "unreachable statement" ...
 
Zuletzt bearbeitet von einem Moderator:
Hab jetzt nicht genau verstanden was du meinst, aber bekommst du dann für p und q diesselbe Zahl raus ?

Nein, ich meinte deine Random Variable: rng. Bei der Initialisierung bekommst sie einen Zufallswert, wenn du diese Variable aber öfters verwendest bleibt dieser Wert derselbe. Wenn du also jedesmal eine neue Zufallszahl haben möchtest musst du vorher rng.NextInteger() (oder so ähnlich, je nach dem was du gerade brauchst) aufrufen.
Da brauchst du auch keine zwei Random Objekte.

Übrigens, wenn ich jetzt noch am ende return q; hinzufüge bekomme ich ne Fehlermeldung "unreachable statement" ...

Jop, nach der ersten return Anweisung wird kein Code mehr ausgeführt, Java unterstützt nur Funktionen mit einer Rückgabevariablen. Für Debugging Zwecke würde ich die Werte einfach in die Console schreiben:

System.out.println("p: " + p.toString() + " q: " + q.toString());
 
Also ich hab es jetzt so geändert:

public RSAAlgorithmus()
{
rng = new Random();
}


public void gibSchluessel()
{
p = BigInteger.probablePrime (32, rng);
rng.nextInt();
q = BigInteger.probablePrime (32, rng);
BigInteger n = p.multiply(q);
BigInteger v = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
k = BigInteger.probablePrime (31, rng);
while (v.gcd(k).equals(BigInteger.ONE) == false)
{
k = BigInteger.probablePrime (31, rng);
}
System.out.println("p; " + p.toString() + " q; " + q.toString());

}

passt das soweit ?
 
Du verwendest rng viermal, demnach musst du auch entsprechend oft rng.NextInt() aufrufen (wenn das für den Algorithmus sinnvoll ist).

Ansonsten solltest du doch jetzt selbst sehen, ob die Zahlen die Werte annehmen die du gerne hättest?
 
Hmm, hab es jetzt einmal ausprobiert mit dem code den ich vorher hatte und jetzt mit diesem code und beide male habe ich für p und q verschiedene Zahlen rausbekommen. Wie gesagt, dass RSA-Verfahren sieht vor, dass p und q zwei verschieden große primzahlen sind.
 
Jop, ich gehe nur davon aus, dass probablePrime() diese zufällige Primzahl auf Basis der als Parameter übergegeben Zufallszahl berechnet - und da erscheint es mir intuitiv sinnvoll, zwei verschiedene Zufallszahlen zu verwenden, wenn man mit größtmöglicher Wahrscheinlichkeit verschieden Primzahlen erhalten möchte.
Mag natürlich sein, dass es in der Praxis kaum einen Unterschied macht.

Edit: Habs jetzt mal nach geschaut, es ist wirklich egal - intern wird ohnehin mehrfach eine weitere Zufallszahl generiert. Kannst also getrost deine alte Fassung weiter nutzen ohne rng.NextInt().
 
Zuletzt bearbeitet von einem Moderator:
Jetzt mal ne andere Frage ^^

Gib es in Java irgendne vorgefertigte Methode, mit der ich eingegeben Buchstaben in den jeweiligen ASCII-Wert umwandeln kann ?
 
char a = 'A';
int ascii = (int)a;

und andersrum
int ascii = 65;
char a = (char)ascii;
 
Dann muss ich das ja für jeden Buchstaben als Variable eintragen oder ?
 
Kannst du deine Frage etwas präziser formulieren? Es kommt ganz darauf an, was du genau machen willst.
 
Es geht darum, dass ich die Buchstaben, die ich eingebe, in Zahlen (vorzugsweise ASCII, eventuell auch Unicode) umwandeln muss, damit ich diese dann verschlüsseln kann. Und umgekehrt dann genauso.
 
Du kannst ja in einer for schleife jeden Buchstaben deines eingegebenen Strings in int casten
PHP:
char[] eingabeArray = eingabe.toCharArray();
for(int i = 0; i < eingabe.length(); i++)
{
int iAscii = (int)eingabeArray[i];
// hier verschlüsselung des wertes und weitere Verarbeitung wie du es benötigst
//...
}
 
Du kannst ja in einer for schleife jeden Buchstaben deines eingegebenen Strings in int casten
PHP:
char[] eingabeArray = eingabe.toCharArray();
for(int i = 0; i < eingabe.length(); i++)
{
int iAscii = (int)eingabeArray[i];
// hier verschlüsselung des wertes und weitere Verarbeitung wie du es benötigst
//...
}

Sorry für die blöde Frage, aber ich komme immer noch nicht drauf, wie das funktionieren soll ^^

Java weiß doch nicht, welcher Wert zu welchem Buchstaben gehört oder ? Das heißt, ich müsste doch erst irgendwie ne Klasse oder so erstellen und da den Buchstaben einen Wert zu weisen oder ?
 
Achso... Sorry lass mich versuchen das zu erklären ;)

In Java hat der primitive Datentyp char einen Wertebereich von 0 - 65535 (16 bit unicode)
Jeder Buchstabe hat so einen eindeutigen zahlenwert zugeordnet. So hat z.B. der Buchstabe A den Zahlenwert 65...
Direkt anschauen kannst du dir das z.B. wenn du in einem Eingabefeld "alt" gedrückt hältst und dann rechts auf dem num block 65 eintippst. Wenn du dann alt los lässt wirst du ein A sehen.

Eine Tabelle die dir die werte errechnet brauchst du also nicht, weil bereits intern jedem Buchstaben ein Wert zugeordnet ist.
 
Ist das nicht vielleicht einfacher ? ^^

PHP:
for (int i = 0; i < klartext.length(); i++) 
{
char c = klartext.charAt(i);
int asciiCode = (int) c;
}
System.out.println(asciiCode);

Das Problem ist nur, dass ich nicht genau weiß, wie das genau mache, dass er nach jedem Durchgehen der for-schleife nicht überschreibe soll, sondern sozusagen int asciiCode = asciiCode + (int) c machen soll.
 
Läuft aufs selbe hinaus, nur das mein code (theoretisch) etwas schneller sein dürfte. Aber ich denke da hast du grad kein Augenmerk drauf ;)

Ich kenn mich mit RSA nicht aus, deshalb kann ich dir keinen Tip geben wie du die Daten letztendlich weiterverarbeiten musst...
 
Naja, bevor ich deinen Code nicht verstehe und nicht dokumentieren kann, nehme ich dann doch lieber den anderen. Trotzdem bleibt noch das Problem, dass er die Variable Asciicode nach jedem durchlaufen neu überschreibt. Wie kann ich das realisieren, dass er asciicode + (int) c machen soll ?
 
Wie gesagt wie der RSA algorithmus arbeitet weiß ich nicht...
Wenn du die werte tatsächlich addieren möchtest kannst du das so machen wie dus geschrieben hast.
PHP:
int asciiCode = 0;
for (int i = 0; i < klartext.length(); i++) 
{
char c = klartext.charAt(i);
asciiCode = asciiCode + (int) c;
}
System.out.println(asciiCode);
 
Hab die Verschlüsselung-Methode jetzt noch ein bisschen überarbeitet, kriege jedoch eine NullPointerException, weiß aber nicht warum:

PHP:
 public void verschluesseln(String pKlartext)
{
klartext = pKlartext;
char[] klartextArray = klartext.toCharArray();
BigInteger[] codierterTextArray = new BigInteger[klartextArray.length];
for(int i = 0; i < klartext.length(); i++)
{
BigInteger buchstabenWert = BigInteger.valueOf((int)klartextArray[i]); 
codierterTextArray[i] = (BigInteger)buchstabenWert.modPow(e, n); 

}

}

edit//

hat sich erledigt.

Ich bin's nochmal. Ich muss das Ganze mit den ASCII-Code verwerfen und den Buchstaben eigene Werte zuweisen, am besten sowas wie 001, 002 usw., da ich sonst keinen belieben Text mit dem jetzigen Algorithmus verschlüsseln kann. Problem jetzt, wie mache ich das mit der Festlegung ? Kann ich ne neue Klasse machen, da die Zuweisung als Variablen eintippen und dann eine Methode schreiben, die die Buchstaben dann umwandelt ?
 
Zuletzt bearbeitet von einem Moderator:
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten