RSA算法中寻找互质数的计算

本文介绍了一种基于RSA算法的简单程序实现,并针对大素数生成、互质数选取及求解R值等问题进行了探讨。作者使用Java和BigInteger类完成了基本的加密解密流程,并寻求更高效的算法来改进现有程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RSA定理
若P和Q是两个相异质数,另有正整数R和M,其中M的值与( P - 1 )( Q - 1 )的值互质,并使得( RM ) mod ( P - 1 )( Q - 1 ) = 1。有正整数A,且A < PQ,设C = AR mod PQ,B = CM mod PQ则有:A = B

参考上面定理,用BigInteger完成了一个简单程序如下

import java.math.BigInteger;
import java.util.Random;


public class RSATest {

public static void main(String[] args){

BigInteger P = BigInteger.valueOf(11);
BigInteger Q = BigInteger.valueOf(7);
BigInteger.probablePrime(1024, new Random());
System.out.println("P is: "+P);
System.out.println("Q is: "+Q);

BigInteger P_1Q_1 = (P.subtract(BigInteger.ONE)).multiply((Q.subtract(BigInteger.ONE)));//(P-1)*(Q-1)
System.out.println("(P-1)*(Q-1) is: "+P_1Q_1);

BigInteger M = BigInteger.valueOf(17);
System.out.println("M is: "+M);

/*
while(true){
M = BigInteger.probablePrime(512, new Random());
if(M.gcd(P_1Q_1).equals(BigInteger.ONE)){
break;
}
}
*/

BigInteger R;

/*****HERE*****/
BigInteger TEST = BigInteger.ONE;
while(true){
if(P_1Q_1.multiply(TEST).add(BigInteger.ONE).mod(M).equals(BigInteger.ZERO)){
R = (P_1Q_1.multiply(TEST).add(BigInteger.ONE)).divide(M);
break;
}
TEST = TEST.add(BigInteger.ONE);
}
/*****HERE*****/
System.out.println("R is: "+R);

BigInteger A = BigInteger.valueOf(6);

BigInteger C = A.modPow(R, P.multiply(Q));

BigInteger B = C.modPow(M, P.multiply(Q));

System.out.println("A is: "+A);
System.out.println("C is: "+C);
System.out.println("B is: "+B);

}
}


该程序能够通过测试,但是是在一些问题被我规避的情况下,其中包括:
1. 两个1024位的大素数的生成(这个可以用BigInteger.probablePrime(1024, new Random())完成)
2. 还有M值的寻找,由于M与(P-1)*(Q-1)互质,故只需要找出一个M,其与(P-1)*(Q-1)的最大公约数为1,但是这一步我找不到一个有效的算法来实现
3. 即上面代码段中标记为HERE的部分,求解R的过程,看过一些参考资料说可以用 辗转相除法算,但是并不了解该过程,就用枚举代替了

想请问大家,有没有比较好的方法可以解决2,3中的问题,谢谢了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值