- 实验目的
熟悉RSA加解密算法的运行过程,加深对素数筛选和使用的理解。
二、 实验步骤
随机生成大素数p和q
计算公开的模数r=pq
计算欧拉函数(r)=(p-1)(q-1)
随机选取整数e,满足gcd(e,(r))=1,若不满足则再次生成
计算d,满足d*e=1mod(r)
将明文x(0 将密文y按模为r自乘d次幂得到明文x 三、 算法实现 import java.math.BigInteger; import java.util.Random; import java.util.Scanner; public class RSA { private Random r; private final BigInteger one; private BigInteger p; private BigInteger q; private BigInteger n; private BigInteger phi; private BigInteger e; private final BigInteger d; public RSA() { r = new Random(); one = new BigInteger("1"); p = BigInteger.probablePrime(256, r); q = BigInteger.probablePrime(256, r); n = p.multiply(q); phi = p.subtract(one).multiply( q.subtract(one)); e = new BigInteger(phi.bitLength(), r); while (e.compareTo(one) <= 0 || !phi.gcd(e).equals(one) || e.compareTo(phi) >= 0) { e = new BigInteger(phi.bitLength() - 1, r); } d = e.modInverse(phi); } public static void main(String[] args) { RSA rsa = new RSA(); Scanner sc=new Scanner(System.in); System.out.println("请输入明文m:"); String mezua = sc.next(); System.out.print("密文:"); System.out.println(rsa.zifratu(mezua)); String ma=rsa.deszifratu( rsa.zifratu(mezua)).toString(); System.out.print("解密密文:"); for(int i=0;i<=ma.length()-2;i+=2) { int num=Integer.parseInt(ma.substring(i,i+2)); System.out.print((char)num); } } private BigInteger zifratu(String mezua) { String mezua2ascii = ""; for(int i=0; i BigInteger message = new BigInteger(mezua2ascii); return message.modPow(e, n); } private BigInteger deszifratu( BigInteger ciphertext) { return ciphertext.modPow(d, n); } } 运行结果:



