while-schleife funzt nicht

  • Java

  • Funk
  • 4508 Aufrufe 33 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • while-schleife funzt nicht

    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:

    Quellcode

    1. while (v.gcd(k)).equals(BigInteger.ONE == false))
    2. {
    3. k = BigInteger.probablePrime (31, rng);
    4. }


    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...

    Quellcode

    1. while (v.gcd(k).equals(BigInteger.ONE) == false)
    2. {
    3. k = BigInteger.probablePrime (31, rng);
    4. }


    So ist die Klammerung korrekt, aber obs so aussehen soll kann ich dir nicht sagen ;)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Zerd ()

  • 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.
  • Java-Quellcode

    1. import java.math.BigInteger;
    2. import java.util.Random;
    3. public class RSAAlgorithmus
    4. {
    5. Random rng;
    6. BigInteger p;
    7. BigInteger q;
    8. BigInteger k;
    9. public RSAAlgorithmus()
    10. {
    11. rng = new Random();
    12. p = BigInteger.probablePrime (32, rng);
    13. q = BigInteger.probablePrime (32, rng);
    14. }
    15. public BigInteger gibSchluessel()
    16. {
    17. p = BigInteger.probablePrime (32, rng);
    18. q = BigInteger.probablePrime (32, rng);
    19. BigInteger n = p.multiply(q);
    20. BigInteger v = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
    21. k = BigInteger.probablePrime (31, rng);
    22. while (v.gcd(k).equals(BigInteger.ONE) == false)
    23. {
    24. k = BigInteger.probablePrime (31, rng);
    25. }
    26. return p;
    27. }
    Alles anzeigen


    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" ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Funk ()

  • 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 ?
  • 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().

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von nile ()

  • Du kannst ja in einer for schleife jeden Buchstaben deines eingegebenen Strings in int casten

    PHP-Quellcode

    1. char[] eingabeArray = eingabe.toCharArray();
    2. for(int i = 0; i < eingabe.length(); i++)
    3. {
    4. int iAscii = (int)eingabeArray[i];
    5. // hier verschlüsselung des wertes und weitere Verarbeitung wie du es benötigst
    6. //...
    7. }
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Zerd schrieb:

    Du kannst ja in einer for schleife jeden Buchstaben deines eingegebenen Strings in int casten

    PHP-Quellcode

    1. char[] eingabeArray = eingabe.toCharArray();
    2. for(int i = 0; i < eingabe.length(); i++)
    3. {
    4. int iAscii = (int)eingabeArray[i];
    5. // hier verschlüsselung des wertes und weitere Verarbeitung wie du es benötigst
    6. //...
    7. }


    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.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Ist das nicht vielleicht einfacher ? ^^

    PHP-Quellcode

    1. for (int i = 0; i < klartext.length(); i++)
    2. {
    3. char c = klartext.charAt(i);
    4. int asciiCode = (int) c;
    5. }
    6. 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...
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • 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-Quellcode

    1. int asciiCode = 0;
    2. for (int i = 0; i < klartext.length(); i++)
    3. {
    4. char c = klartext.charAt(i);
    5. asciiCode = asciiCode + (int) c;
    6. }
    7. System.out.println(asciiCode);
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Hab die Verschlüsselung-Methode jetzt noch ein bisschen überarbeitet, kriege jedoch eine NullPointerException, weiß aber nicht warum:

    PHP-Quellcode

    1. public void verschluesseln(String pKlartext)
    2. {
    3. klartext = pKlartext;
    4. char[] klartextArray = klartext.toCharArray();
    5. BigInteger[] codierterTextArray = new BigInteger[klartextArray.length];
    6. for(int i = 0; i < klartext.length(); i++)
    7. {
    8. BigInteger buchstabenWert = BigInteger.valueOf((int)klartextArray[i]);
    9. codierterTextArray[i] = (BigInteger)buchstabenWert.modPow(e, n);
    10. }
    11. }
    Alles anzeigen


    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 ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Broken Sword () aus folgendem Grund: Kein Doppelposts =&gt; Regeln lesen!