RSAアルゴリズムの説明:

		/**
		 * 算法描述:
		 * (1)选择一对不同的、足够大的素数p,q。
		 * (2)计算n=pq。
		 * (3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。
		 * (4)找一个与f(n)互质的数e,且1<e<f(n)。
		 * (5)计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)
		 *     这里要解释一下,≡是数论中表示同余的符号。公式中,≡符号的左边必须和符号右边同余,
		 *     也就是两边模运算结果相同。显而易见,不管f(n)取什么值,符号右边1 mod f(n)的
		 *     结果都等于1;符号的左边d与e的乘积做模运算后的结果也必须等于1。这就需要计算出d
		 *     的值,让这个同余等式能够成立。
		 * (6)公钥KU=(e,n),私钥KR=(d,n)。
		 * (7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,
		 *     然后再进行交换。
		 * 
		 * 		知道 p=13、q=59、当e=13时,计算出d
		 * 
		 * 		注意:这里的秘钥e、d之间的关系
		 */
package 其他;

import java.util.ArrayList;

public class B {
    
    
	public static void main(String[] args) {
    
    
		double p,q,d,e,n,Fn;
		ArrayList<Integer> list=new ArrayList<>();
		e=13;
		p=43;q=59;
		n=p*q;
		Fn=(p-1)*(q-1);
		System.out.println("  p:"+p);
		System.out.println("  q:"+q);
		System.out.println("  n=p*q="+n);
		System.out.println("  Fn=(p-1)*(q-1)="+Fn);
		System.out.println("==================================================");
		for(int i=(int)n+1;i<100+n;i++) {
    
    
			if(i*e>n) {
    
    
				System.out.print(i+"对n(2537)取余等于:"+i%n+";   ");
				System.out.println(i+"除以e(13)等于:"+(int)i/e+"   余:"+i%e);
				if(i%e==0) {
    
    
					double v= i/e;
					list.add((int)v);
				}
			}
		}
		System.out.println(" ");
		System.out.println("=====================================");
		System.out.println(" ");
		System.out.print("当d*e的取值范围在区间"+(n+1)+"到"+(n+100)+"中时,d的可能取值为:");
		for(int i=0;i<list.size();i++) {
    
    
			System.out.print(list.get(i)+" ");
		}
		System.out.println( );
		System.out.println("=====================================");
		System.out.println(" ");
		System.out.println("故,在此区间,公钥及私钥可以有:");
		for(int i=0;i<list.size();i++) {
    
    
			System.out.print("("+(int)e+","+(int)n+"),"+"("+list.get(i)+","+(int)n+");");
			if(i!=0&&i%3==0) {
    
    
				System.out.println();
			}
			
		}
		System.out.println(" ");
		System.out.println(" ");
	}
}

おすすめ

転載: blog.csdn.net/DAurora/article/details/105817275