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完成了一个简单程序如下
该程序能够通过测试,但是是在一些问题被我规避的情况下,其中包括:
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中的问题,谢谢了
若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中的问题,谢谢了