/**
* 算法描述:
* (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(" ");
}
}
RSA algorithm description:
Guess you like
Origin blog.csdn.net/DAurora/article/details/105817275
Recommended
Ranking