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

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中的问题,谢谢了

你可能感兴趣的:(C++,c,算法,C#,F#)