|

楼主 |
发表于 2022-5-3 10:49:10
|
显示全部楼层
RSA加解密
代码:
- package hello;
- import java.math.BigInteger;
- import java.util.Random;
- import java.util.Scanner;
-
- //RSA算法
- public class TestRSA {
- @SuppressWarnings("resource")
- public static void main(String[] args) {
- TestRSA rsa=new TestRSA();
- BigInteger[] primeNumber = rsa.getPrimeNumber();
- //step1:产生两个大素数
- BigInteger p=primeNumber[0];
- BigInteger q=primeNumber[1];
- System.out.println("1、B产生的两个大素数是:p="+p+" q="+q);
- //step2.1:计算n
- BigInteger n=p.multiply(q);//n=p*q
- System.out.println("2、计算的n是:"+n);
- //step2.2:计算sn
- BigInteger sn=(p.subtract(new BigInteger("1"))).multiply(q.subtract(new BigInteger("1")));//sn=(p-1)*(q-1)
- System.out.println(" 计算的sn是:"+sn);
- //step3:随机选取e
- BigInteger e=rsa.getE(sn);//0<e<sn && e和 sn互素
- System.out.println("3、选取的e是:"+e);
- //step4:计算d
- BigInteger d=rsa.getD(sn, e).mod(sn);//d同时与n和sn互素
- System.out.println("4、计算的d是:"+d);
- //step5:B将n和e作为公钥公开
- System.out.println("5、公钥:n="+n+" e="+e);
- System.out.println("6、请输入要发送的明文:");
- Scanner scanner=new Scanner(System.in);
- BigInteger m=new BigInteger(scanner.next());
- BigInteger c=rsa.getC(m,e,n);//计算密文
- System.out.println("加密后的密文是:"+c);
- //step8:进行解密
- BigInteger mm=rsa.getDecrypt(c,n,d);//进行解密
- System.out.println("解密后的的结果是:"+mm);
- }
- //随机产生两个大素数: res[0]、res[1]
-
- public BigInteger[] getPrimeNumber(){
- BigInteger p=null;
- BigInteger q=null;
- BigInteger[] res=new BigInteger[2];
- Random random = new Random();
- p=BigInteger.probablePrime(64, random);
- q=BigInteger.probablePrime(64, random);
- res[0]=p;
- res[1]=q;
- return res;
- }
- //随机选取e
- // 0<e<sn && e和 sn互素
-
- public BigInteger getE(BigInteger sn){
- BigInteger e = null;
- int length = sn.toString().length()-2;// length为随机数位数
- e=new BigInteger(sn.toString().subSequence(0, length-2).toString()).nextProbablePrime();
- return e;
- }
- //选取d
- //d同时与n和sn互素
-
- public BigInteger getD(BigInteger sn,BigInteger e){
- BigInteger[] ret = new BigInteger[3];
- BigInteger u = BigInteger.valueOf(1), u1 = BigInteger.valueOf(0);
- BigInteger v = BigInteger.valueOf(0), v1 = BigInteger.valueOf(1);
- if (e.compareTo(sn) > 0) {
- BigInteger tem = sn;
- sn = e;
- e = tem;
- }
- while (e.compareTo(BigInteger.valueOf(0)) != 0) {
- BigInteger tq = sn.divide(e); // tq = sn / e
- BigInteger tu = u;
- u = u1;
- u1 = tu.subtract(tq.multiply(u1)); // u1 =tu - tq * u1
- BigInteger tv = v;
- v = v1;
- v1 = tv.subtract(tq.multiply(v1)); // v1 = tv - tq * v1
- BigInteger tsn = sn;
- sn = e;
- e = tsn.subtract(tq.multiply(e)); // e = tsn - tq * e
- ret[0] = u;
- ret[1] = v;
- ret[2] = sn;
- }
- return ret[1];
- }
- //计算密文
-
- public BigInteger getC(BigInteger m,BigInteger e,BigInteger n){
- BigInteger c=null;
- c=m.modPow(e, n);//返回其值为 (m^e mod n)
- return c;
- }
- //计算解密
-
- public BigInteger getDecrypt(BigInteger c,BigInteger n,BigInteger d){
- BigInteger m=null;
- m=c.modPow(d, n);//返回其值为 (c^d mod n)
- return m;
- }
- }
复制代码运行截图:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|