尝试从String转换为Int会导致第一个字符变为'?'

时间:2016-12-21 07:24:07

标签: java string ascii rsa

我目前正在学校开展RSA编码系统,但是,我和老师都无法解决这个问题:

当我尝试解码编码文本时,程序将第一个字符作为?返回,其余字符串是正确的。也许有人可以帮助我,如果我可以做出一些其他的改进。

PS:因为我是德国人,所以有些东西可能是德语,但它们与输出/返回无关。我已经包含了整个脚本,以便能够完全运行它并找到我更快的错误。控制台会要求您输入以下内容:

1.Anfang =选择素数的数组的开始

2.Ende =数组结束

3.Zahldiegrößerals1,aber kleiner als phiN ist =输入任何Prime数字,如101,13等等

4.输入您喜欢的任何字符编码

5.你得到一个没有编码的文本?作为第一个角色

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);
    }
}

1 个答案:

答案 0 :(得分:1)

问题在于您的算法位于以下行

hj[j]=(char)cancer;

此行返回无效字符

你的变量&#34; j&#34;没有增加,以便&#34;无效&#34;变量将始终替换为hj[j],即位置0(零)。