2016-12-21 4 views
0

私は今でも学校のRSAコーディングシステムに取り組んでいますが、私も教師も解決できない問題があります。StringからIntに変換しようとすると、最初の文字が '?'になります。

エンコードされたテキストをデコードしようとすると、文字が?である場合、残りの文字列は正しいです。たぶん誰かが私を助けてくれるかもしれません。

PS:私はドイツ人ですから、ドイツ語であるかもしれませんが、出力/リターンとは関係ありません。私はあなたが完全にそれを実行し、私がより速くした間違いを見つけることができるようにするためのスクリプト全体を含めました。コンソールは、入力に次のことをお聞きします:素数がアレイ

3.Zahlの

2.Ende =エンドはグローサーALSダイ選ばれた配列の

1.Anfang =ビギニング1、ABERクライナーALS PHINイストは=あなたがして符号化されていないテキストを取得

5.Youをコーディングしたい任意の文字に

4.Putに101、13などのような任意の素数に入れますか?最初の文字

package ggt; 

import java.util.Scanner; 

public class RSA { 

    public static long Prim (long a, long b){ 
     boolean t = true; 
     long primzahl =1; 
     for (;a<(b+1);a++){ 
      for (long i=2;i<=(a/2)&&(t==true);i++){ 
       if (a%i==0){ 
        t=false; 
       } 

      } 
      if (t==true){ 
       primzahl= a; 

      } 
      t=true; 
     } 
     return primzahl; 
    } 
    public static boolean ggt(long a, long b){ 
     long c=b; 
     while(!(a%c==0&&b%c==0)){ 
       c=c-1; 
     } 
     if (c == 1){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
    public static int[] extendedGcd(int x, int y){ 
     int u = 1; 
     int v = 0; 
     int s = 0; 
     int t = 1; 
     int q = 1; 
     int ue[] = new int[3]; 
     while (y>0){ 
      q = x/y; 
      x = y; 
      y = x-q*y; 
      u = s; 
      s = u-q*s; 
      v = t; 
      t = v-q*t; 
     } 
     ue[0]=x; 
     ue[1]=u; 
     ue[2]=v; 
     return ue; 
    } 
    public static void main(String[]args){ 
      Scanner xx=new Scanner(System.in); 
      System.out.println("Anfang"); 
      long a = xx.nextLong(); 
      System.out.println("Ende"); 
      long b = xx.nextLong(); 
      long p = Prim(a,b); 
      System.out.println("Primzahl p= "+p); 
      long q = Prim(3,a); 
      System.out.println("Primzahl q= "+q); 
      //public key 
      long phiN = (p - 1) * (q - 1); 
      System.out.println("e soll größer als 1, aber kleiner als phiN sein. phiN ist"+phiN); 
      long e = xx.nextLong(); 
      long enn=p*q; 
      if (e<1){ 
       System.out.println("e ist nicht korrekt. Wer lesen kann, schafft es durch die Schule."); 
       System.exit(0);} 
     boolean be=ggt(e, phiN); 
     if (!(be==true)){ 
      System.out.println("e ist nicht teilerfremd zu phiN"); 
      System.exit(0); 
     } 
     System.out.println("Der Public Key ist "+e+","+enn); 
     //private key 
     int d=1; 
     while (!((e*d)%phiN==1)){ 
      d=d+1; 
     } 
     System.out.println("Der Private Key ist "+d+","+enn); 
     System.out.println("Geben Sie bitte den zu verschlüsselnden Satz ein."); 
     //Verschlüsselung 
     Scanner yy=new Scanner(System.in); 
     String uncoded=yy.nextLine(); 
     char []hj=uncoded.toCharArray(); 
     int j=0; 
     long cancer; 
     System.out.println("Der Verschlüsselte Text lautet(von oben nach unten):"); 
     for (int i=0; i != uncoded.length();i++){ 
      char character=uncoded.charAt(i); 
      int ascii=(int)character; 
      //System.out.println(ascii); 
      //System.out.println(d); 
      //System.out.println(enn); 
      a=(long)(Math.pow(ascii, d)); 
      cancer=a%enn; 
      //System.out.println(cancer); 
      //System.out.println(a); 
      cancer=((long)(Math.pow(cancer, e))%enn); 
      hj[j]=(char)cancer; 
     }System.out.println("Der entschlüsselte Text ist"); 
     System.out.println(hj); 
    } 
} 
+0

@ScaryWombatこれは問題ではありません。もしあなたがhallo weltを入力すれば、出力はohallo welt – XtremeBaumer

+0

が私の提案を削除しました。 –

答えて

1

問題は、この行は「無効」変数ように、あなたの変数「j」がインクリメントされていない無効な文字

を返す行の下

hj[j]=(char)cancer; 

であなたのアルゴリズムであるとして、 hj[j]、つまり位置0(ゼロ)に常に置き換えられます。

関連する問題