Problem mit modulo Rechnung

epsodus

Mitglied
Hallo zusammen,
ich habe erst vor kurzen mit java angefangen. Es geht so leidlich vorwärts. Ich habe ein Programm
geschrieben um M=C^E mod N zu berechnen. Bitte nicht meckern es ist noch etwas durcheinander und nicht optimiert. Ich habe BigInteger wegen der großen Zahlen genommen.Bisher habe ich die Zahlen aus dem File herauskopiert und eingefügt. C und N sind immer Hexzahlen, die vor dem einsetzen in DEZ umgerechnet habe.
Gibt es eine Möglichkeit die Hexwerte aus dem File auszulesen, in DEZ umzurechnen und an die passenden Stellen einzufügen. Zugleich kommt jetzt noch immer das Ergebnis als DEZ -Wert raus. Ich würde gerne das Ergebnis als DEZ und HEX haben. Ich hoffe das man mir hier helfen kann, Danke

Java:
import java.math.BigInteger;
 
 public class test1 {
     
     
      BigInteger modexp (BigInteger m, BigInteger e, BigInteger n){
            int k=e.bitLength();
            BigInteger s = BigInteger.ONE;
            for (int i=k-1; i>=0; i--)
            {
                  s=s.multiply(s).mod(n);
                  if (e.testBit(i))
                        s=s.multiply(m).mod(n);
                 
            }
            return s;
      }
     
     
      public BigInteger run(BigInteger n){
       //m=C³ mod N
            BigInteger a = new BigInteger("-2");
            BigInteger three = new BigInteger("9");
            BigInteger ergebnis = new BigInteger("0");
            BigInteger one = new BigInteger("1");
            boolean end = false;
           
            while (end==false){
                  a = a.add(new BigInteger("-1"));
                  ergebnis = one.subtract(n.multiply(a)).mod(three);
                  if (ergebnis == BigInteger.ZERO){
                       
                        end = true;
                       
                  }
                  System.out.println(a);
            }
           
            System.out.println(a + " " + one.subtract(n.multiply(a)).divide(three));
           
            return one.subtract(n.multiply(a)).divide(three);
      }
      //m*-6+3*d= ganze Zahl dann d
     
      public static void main (String args[]){
            BigInteger n = new BigInteger("xxxxxxxxxx");
            BigInteger c = new BigInteger("xxxxxxxxxxx");
            BigInteger e = new BigInteger("x");
        //    BigInteger m = new BigInteger("xxxxxxxxx");
 
                                          
            test1 t = new test1();
            System.out.println(t.modexp (c,e,n));
 
Zuletzt bearbeitet:
Spricht was dagegen, BigInteger.modPow(BigInteger, BigInteger) zu verwenden? Und wegen Hex/Dez: Konstruktor BigInteger(String, int) bzw. BigInteger.toString(int) verwenden (je nachdem).

Ark
 
Danke für die Antwort. Muss ich mal ausprobieren, wie gesagt ich beschäftige mich mit java ( oder dem programmieren ) erst seit zwei Wochen. Bin froh das meine Rohfassung des Programms läuft.
Werde mich gleich mal mit Deinem Hinweis beschäftigen. Versuche auch noch das Programm zu optimieren, es erscheint mir zu kompliziert aufgebaut zu sein, oder ich denke zu kompliziert.
 
Ark's Hinweise sind schon mal richtig. Ich würde darüber hinaus vorschlagen, ein bisschen mehr OO in die Sache zu bringen: Eine Zahl in einer Restklasse (oder "Modul") ist keine "normale" Zahl mehr, und verdient deshalb eine eigene Klasse. Bei komplexen Zahlen würde man ja auch nicht separat mit Real- und Imaginärteil rumhantieren. Eine mögliche Implementierung:

Java:
public class ModInt {
   private BigInteger value;
   private BigInteger module;

   public ModInt(BigInteger value, BigInteger module) {
         this.value = value.mod(module); //Wert gleich in den richtigen Bereich bringen
         this.module = module;
   }

   public ModInt add(ModInt that) {
         assert this.module.equals(that.module);
         return new ModInt(this.value.add(that.value), module); //das mod übernimmt der Konstruktor
   }

   //u.s.w.
}

Damit gibt es einen einzigen Platz, wo die ganze Modul-Logik untergebracht ist, wodurch man das Ganze viel sicherer und leichter handhaben kann.
 
Zuletzt bearbeitet:
Vielen Dank für Eure Hinweise, aber mit der Umwandlung zum HEX-Format klappt es noch nicht.
Mit System.out.println(t.modexp (c,e,n)); bekomme ich mein Ergebnis in Dezimalform, aber im Moment weis ich nicht wie ich das Ergebnis in HEX darstellen kann. Ich bin etwas durcheinander, wegen der ganzen Hinweise. kann mir da noch jemand auf die Sprünge helfen ?
 
Hallo,

Danke für Eure ganzen Hinweise, man muss erst einmal eine Nacht darüber schlafen und dann neu anfangen. Eure Hinweise haben mir sehr geholfen, wie gesagt ich bin noch nicht so fit im Programmieren. Habe das Programm jetzt etwas aufgeräumt, jetzt ist es übersichtlicher.
Jetzt habe ich noch ein anderes Problem, vielleicht helft Ihr mir da auch ein wenig.
In Linux kann ich folgendes eingeben :

open x509 -inform DER -in $FL.der -outform PEM -out $FL.pem
open x509 -in $FL.pem -noout - text -fingerprint -sha1 -modulus>$FL.txt

Damit lese ich ein Cert.der Zertifikat ein und schreibe es in Klarform (FL.txt ) in eine Datei.
Kann man das in Java auch machen ?
 

Zurück
Oben