import java.util.Scanner;
public class RsaEncry {
public static void main(String[] args) {
// TODO Auto-generated method stub
long number = 100;//明文
long n ; //p*q;
long[] theKey = new long[2];
Scanner input = new Scanner(System.in);
System.out.println("please input prime number p!");
long p = input.nextLong();
System.out.println("please input prime number q!");
long q = input.nextLong();
n = p*q;
Key key = new Key(p,q,n);
theKey = key.getKey();
System.out.println("e:"+theKey[0]+" d: "+theKey[1] + " l: "+(p-1)*(q-1));
doRsa test = new doRsa(theKey[0],theKey[1],n);
long answer = test.doEncry(number);
System.out.println(number+"加密后为"+answer);
long answer2 = test.doUnEncry(answer);
System.out.println("解密后为"+answer2);
}
}
public class Key {
long p,q,n,l,e,d=0,num=0;
long[] e1 = new long[1000];
long[] d1 = new long[50];
long[] theKey = new long[2];
public Key(long p, long q, long n) {
// TODO Auto-generated constructor stub
this.p = p;
this.q = q;
this.n = n;
l = (p-1)*(q-1);
e1[0] = 1;
for(int j=1,i =4;i<l;i++ ){
//Math.gcb();
int flag =1;
if(l%3!=0&&l>3){
e1[1] = 3;
j++;
}
if(l%2!=0&&l>2){
e1[1] = 3;
j++;
}
for(int x=2;x<=Math.sqrt(l)&&x<=Math.sqrt(i);x++){
if(l%i==0){
flag = 0;
break;
}
if(l%x==0&&i%x==0){
flag = 0;
break;
}
}
if(flag==1){
e1[j] = i;
num++;
j++;
}
flag = 1;
}
e = e1[(int)(Math.random()*num)];
theKey[0] = e;
for(int i = 1;i<2*e;i++)
{
if((i*l+1)%e==0)
{
d= (i*l+1)/e;
}
}
theKey[1] = d;
}
public long[] getKey() {
// TODO Auto-generated method stub
return theKey;
}
}
public class doRsa {
long number;
long e,d,n;
//private long answer;
public doRsa(long e,long d,long n)
{
this.e = e;
this.d = d;
this.n = n;
//number = num;
}
public long doEncry(long c)
{
// long a(c),long k(e),long M(n)
long answer=1;
while(e>=1){
if(e%2==1){
answer=c*answer%n;
}
c=(c%n)*(c%n)%n;
e/=2;
}
return answer;
}
public long doUnEncry(long m)
{
// long a(c),long k(e),long M(n)
long answer=1;
while(d>=1){
if(d%2==1){
answer=m*answer%n;
}
m=(m%n)*(m%n)%n;
d/=2;
}
return answer;
}
}