我目前正在学校开展RSA编码系统,但是,我和老师都无法解决这个问题:
当我尝试解码编码文本时,程序将第一个字符作为?
返回,其余字符串是正确的。也许有人可以帮助我,如果我可以做出一些其他的改进。
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);
}
}
答案 0 :(得分:1)
问题在于您的算法位于以下行
hj[j]=(char)cancer;
此行返回无效字符
你的变量&#34; j&#34;没有增加,以便&#34;无效&#34;变量将始终替换为hj[j]
,即位置0(零)。