教学服务系统

 找回密码
 立即注册
搜索
查看: 490|回复: 1

信息计算2019级1班9号陈佳怡

[复制链接]

8

主题

15

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2022-4-22 15:37:34 | 显示全部楼层 |阅读模式
本帖最后由 19-1-09陈佳怡 于 2022-4-29 22:01 编辑

4.19

4.22


4.29

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

15

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2022-5-3 10:49:10 | 显示全部楼层
RSA加解密

代码:

  1. package hello;

  2. import java.math.BigInteger;
  3. import java.util.Random;
  4. import java.util.Scanner;

  5. //RSA算法
  6. public class TestRSA {
  7.         @SuppressWarnings("resource")
  8.         public static void main(String[] args) {
  9.                 TestRSA rsa=new TestRSA();
  10.                 BigInteger[] primeNumber = rsa.getPrimeNumber();
  11.                 //step1:产生两个大素数
  12.                 BigInteger p=primeNumber[0];
  13.                 BigInteger q=primeNumber[1];
  14.                 System.out.println("1、B产生的两个大素数是:p="+p+" q="+q);
  15.                 //step2.1:计算n
  16.                 BigInteger n=p.multiply(q);//n=p*q
  17.                 System.out.println("2、计算的n是:"+n);
  18.                 //step2.2:计算sn
  19.                 BigInteger sn=(p.subtract(new BigInteger("1"))).multiply(q.subtract(new BigInteger("1")));//sn=(p-1)*(q-1)
  20.                 System.out.println("   计算的sn是:"+sn);
  21.                 //step3:随机选取e
  22.                 BigInteger e=rsa.getE(sn);//0<e<sn && e和 sn互素
  23.                 System.out.println("3、选取的e是:"+e);
  24.                 //step4:计算d
  25.                 BigInteger d=rsa.getD(sn, e).mod(sn);//d同时与n和sn互素
  26.                 System.out.println("4、计算的d是:"+d);
  27.                 //step5:B将n和e作为公钥公开
  28.                 System.out.println("5、公钥:n="+n+" e="+e);
  29.                 System.out.println("6、请输入要发送的明文:");
  30.                 Scanner scanner=new Scanner(System.in);
  31.                 BigInteger m=new BigInteger(scanner.next());
  32.                 BigInteger c=rsa.getC(m,e,n);//计算密文
  33.                 System.out.println("加密后的密文是:"+c);
  34.                 //step8:进行解密
  35.                 BigInteger mm=rsa.getDecrypt(c,n,d);//进行解密
  36.                 System.out.println("解密后的的结果是:"+mm);
  37.         }
  38.         //随机产生两个大素数: res[0]、res[1]
  39.        
  40.         public BigInteger[] getPrimeNumber(){
  41.                 BigInteger p=null;
  42.                 BigInteger q=null;
  43.                 BigInteger[] res=new BigInteger[2];
  44.                 Random random = new Random();
  45.             p=BigInteger.probablePrime(64, random);
  46.             q=BigInteger.probablePrime(64, random);
  47.                 res[0]=p;
  48.                 res[1]=q;
  49.                 return res;
  50.         }
  51.         //随机选取e
  52.          // 0<e<sn && e和 sn互素
  53.          
  54.         public BigInteger getE(BigInteger sn){
  55.                 BigInteger e = null;
  56.                 int length = sn.toString().length()-2;// length为随机数位数
  57.                 e=new BigInteger(sn.toString().subSequence(0, length-2).toString()).nextProbablePrime();
  58.                 return e;
  59.         }
  60.         //选取d
  61.          //d同时与n和sn互素
  62.        
  63.         public BigInteger getD(BigInteger sn,BigInteger e){
  64.                 BigInteger[] ret = new BigInteger[3];  
  65.             BigInteger u = BigInteger.valueOf(1), u1 = BigInteger.valueOf(0);  
  66.             BigInteger v = BigInteger.valueOf(0), v1 = BigInteger.valueOf(1);  
  67.             if (e.compareTo(sn) > 0) {  
  68.                 BigInteger tem = sn;  
  69.                 sn = e;  
  70.                 e = tem;  
  71.             }  
  72.             while (e.compareTo(BigInteger.valueOf(0)) != 0) {  
  73.                 BigInteger tq = sn.divide(e); // tq = sn / e  
  74.                 BigInteger tu = u;  
  75.                 u = u1;  
  76.                 u1 = tu.subtract(tq.multiply(u1)); // u1 =tu - tq * u1  
  77.                 BigInteger tv = v;  
  78.                 v = v1;  
  79.                 v1 = tv.subtract(tq.multiply(v1)); // v1 = tv - tq * v1  
  80.                 BigInteger tsn = sn;  
  81.                 sn = e;  
  82.                 e = tsn.subtract(tq.multiply(e)); // e = tsn - tq * e  
  83.                 ret[0] = u;  
  84.                 ret[1] = v;  
  85.                 ret[2] = sn;  
  86.             }  
  87.                 return ret[1];
  88.         }
  89.         //计算密文
  90.          
  91.         public BigInteger getC(BigInteger m,BigInteger e,BigInteger n){
  92.                 BigInteger c=null;
  93.                 c=m.modPow(e, n);//返回其值为 (m^e  mod n)
  94.                 return c;
  95.         }
  96.         //计算解密
  97.          
  98.         public BigInteger getDecrypt(BigInteger c,BigInteger n,BigInteger d){
  99.                 BigInteger m=null;
  100.                 m=c.modPow(d, n);//返回其值为 (c^d  mod n)
  101.                 return m;
  102.         }
  103. }
复制代码
运行截图:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

教学服务系统

GMT+8, 2025-4-30 14:15 , Processed in 0.017257 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表