Begin
记录一下自己的学习过程啦~~
上题目
试题 E: RSA 解密
【问题描述】
RSA 是一种经典的加密算法。它的基本加密过程如下。
首先生成两个质数 p, q,令 n = p · q,设 d 与 (p − 1) · (q − 1) 互质,则可
找到 e 使得 d · e 除 (p − 1) · (q − 1) 的余数为 1。
n, d, e 组成了私钥,n, d 组成了公钥。
当使用公钥加密一个整数 X 时(小于 n),计算 C = Xd mod n,则 C 是加
密后的密文。
当收到密文 C 时,可使用私钥解开,计算公式为 X = Ce mod n。
例如,当 p = 5, q = 11, d = 3 时,n = 55, e = 27。
若加密数字 24,得 243 mod 55 = 19。
解密数字 19,得 1927 mod 55 = 24。
现在你知道公钥中 n = 1001733993063167141, d = 212353,同时你截获了
别人发送的密文 C = 20190324,请问,原文是多少?
思路过程
1.已知n、d、c,求x( X =Ce mod n)
2.要求x需求e
3.结合已知条件,若要求e需求d与e的关系:(de-1)%[(p-1)(q-1)]==0
4.若要求e、d间关系需求p、q
5.p、q即为n的质因数
代码
数据较大时,这代码跑的着实的慢,还没想好怎么优化
public class Main {
public static void main(String[] args) {
long[] a=new long[2];
long n= 55L;
long d= 3L;
double c=24;
double e,x;
a=pq(n,d,a);
long p=a[0],q=a[1];
for(long i=1;i<=500000;i++){
if((d*i-1)%((p-1)*(q-1))==0){
e=i;
System.out.println("e="+e);
break;
}
}
x=Math.pow(c,d)%n;
System.out.println("x="+x);
}
public static long[] pq(long n,long d,long[] a){
long i;
boolean j;
for(i=2;i<=n;i++){
if(!zhishu(i))
continue;
if(n%i==0){
j=huzhi(d,(i-1)*(n/i-1));
if(zhishu(n/i)&&j)
break;
}
}
a[0]=i;
a[1]=n/i;
System.out.println("p="+a[0]);
System.out.println("q="+a[1]);
return a;
}
public static boolean zhishu(long x){
boolean y=true;
for(int i=2;i<=Math.sqrt(x);i++){
if(x!=2&&x%i==0){
y=false;
break;
}
}
return y;
}
public static boolean huzhi(long a,long b){
long t;
while(b>0){
t=a%b;
a=b;
b=t;
}
if(a==1)
return true;
else
return false;
}
}
总结
1.互质
定义:两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数,叫做互质数。
判断:用大数除以小数,如果除得的余数与其中较小数互质,则原来两个数是互质数。
2.求一个数的质因数
public int[] pq(int n,int[] a){
int i;
for(i=2;i<=n;i++){
if(!zhishu(i))
continue;
if(n%i==0){
if(zhishu(n/i))
break;
}
}
a[0]=i;
a[1]=n/i;
return a;
}
public boolean zhishu(int x){
boolean y=true;
for(int i=2;i<=Math.sqrt(x);i++){
if(x!=2&&x%i==0){
y=false;
break;
}
}
return y;
}
3.判断两个数是否互质
private static boolean get(int n, int m) {
int t=0;
while(m>0) {
t=n%m;
n=m;
m=t;
}
if(n==1)return true;
return false;
}