hahaso 发表于 2013-2-4 19:48:02

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中的问题,谢谢了
页: [1]
查看完整版本: RSA算法中寻找互质数的计算