第十届蓝桥杯: RSA 解密

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;
	}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值