|

楼主 |
发表于 2022-5-3 09:09:38
|
显示全部楼层
本帖最后由 吴春滟 于 2022-6-2 21:58 编辑
- <b style="font-size: x-large; background-color: rgb(255, 255, 255);">大数RSA算法的实现</b>
复制代码- package aa;
- public class Node {
- private double p;
- private char alpha;
- public Node(double p, char alpha) {
- this.p = p;
- this.alpha =alpha;
- }
- public void setp(double p) {
- this.p = p;
- }
- public void setalpha(char a) {
- this.alpha =a;
- }
- public double getp() {
- return p;
- }
- public char getalpha() {
- return alpha;
- }
- }
复制代码- package aa;
- import java.math.BigInteger;
- public class Prime {
- public boolean sushu(double n) {
- // 判断素数
- boolean isPrime = true;
- // 如果n大于2 继续判断 否则 isPrime的值不变 2素数
- if (n > 2) {
- // 如果n是大于2的偶数 认定不是素数 修改变量值为false
- if (n % 2 == 0) {
- isPrime = false;
- } else {
- for (int i = 3; i <= (int) Math.sqrt(n); i += 2) {
- if (n % i == 0) {
- isPrime = false;
- break;
- }
- }
- }
- }
- return isPrime;
- }
- private static final BigInteger ZERO = BigInteger.ZERO;
- private static final BigInteger ONE = BigInteger.ONE;
- private static final BigInteger TWO = new BigInteger("2");
- private static final int ERR_VAL = 100;
- public BigInteger nextPrime(BigInteger start) {
- if (isEven(start))
- start = start.add(ONE);
- else
- start = start.add(TWO);
- if (start.isProbablePrime(ERR_VAL))
- return (start);
- else
- return (nextPrime(start));
- }
- private static boolean isEven(BigInteger n) {
- return (n.mod(TWO).equals(ZERO));
- }
- public BigInteger bigRandom(int numDigits) {
- StringBuffer s = new StringBuffer("");
- for (int i = 0; i < numDigits; i++)
- if (i == 0)
- s.append(randomDigit(false));
- else
- s.append(randomDigit(true));
- return (new BigInteger(s.toString()));
- }
- private StringBuffer randomDigit(boolean isZeroOK) {
- int index;
- if (isZeroOK)
- index = (int) Math.floor(Math.random() * 10);
- else
- index = 1 + (int) Math.floor(Math.random() * 9);
- return (digits[index]);
- }
- private static StringBuffer[] digits = { new StringBuffer("0"),
- new StringBuffer("1"), new StringBuffer("2"),
- new StringBuffer("3"), new StringBuffer("4"),
- new StringBuffer("5"), new StringBuffer("6"),
- new StringBuffer("7"), new StringBuffer("8"), new StringBuffer("9") };
- public static void main(String[] args) {
- }
- }
复制代码- package aa;
- import java.math.BigInteger;
- import java.util.ArrayList;
- import java.util.Scanner;
- public class RSA {
- static BigInteger x, y;
- public static boolean fun(BigInteger x, BigInteger y) {
- BigInteger t;
- while (!(y.equals(new BigInteger("0")))) {
- t = x;
- x = y;
- y = t.mod(y);
- }
- if (x.equals(new BigInteger("1")))
- return false;
- else
- return true;
- }
- public static BigInteger siyue(BigInteger a, BigInteger b) {
- BigInteger temp;
- if (b.equals(new BigInteger("0"))) {
- x = new BigInteger("1");
- y = new BigInteger("0");
- return x;
- }
- siyue(b, a.mod(b));
- temp = x;
- x = y;
- y = temp.subtract((a.divide(b).multiply(y)));
- return x;
- }
- public static double entropy(String mess) {
- ArrayList<Node> jieguo = new ArrayList<Node>();
- jieguo.clear();
- double num = mess.length();
- for (int i = 0; i < num; i++) {
- boolean flag_exit = true;
- for (int j = 0; j < jieguo.size(); j++) {
- if (jieguo.get(j).getalpha() == mess.charAt(i)) {
- flag_exit = false;
- jieguo.get(j).setp(jieguo.get(j).getp() + 1 / num);
- }
- }
- if (flag_exit)
- jieguo.add(new Node(1 / num, mess.charAt(i)));
- }
- /** 计算熵 */
- double entropy = 0;
- for (int i = 0; i < jieguo.size(); i++) {
- double p1 = jieguo.get(i).getp();
- entropy += (-p1 * (Math.log(p1) / Math.log(2)));
- }
- return entropy;
- }
- public static void main(String[] args) {
- BigInteger p = null;
- BigInteger e, d, n, t, c;
- BigInteger q = null;
- for (int i = 0; i < 2; i++) {
- int numDigits;
- Prime pri = new Prime();
- try {
- numDigits = Integer.parseInt("15");
- } catch (Exception e1) {
- numDigits = 128;
- }
- BigInteger start = pri.bigRandom(numDigits);
- BigInteger big = pri.nextPrime(start);
- if (i == 0)
- p = big;
- else
- q = big;
- }
- Scanner input = new Scanner(System.in);
- n = p.multiply(q);
- t = p.subtract(new BigInteger("1")).multiply(
- q.subtract(new BigInteger("1")));
- int numDigits;
- Prime pri = new Prime();
- try {
- numDigits = Integer.parseInt("15");
- } catch (Exception e1) {
- numDigits = 128;
- }
- BigInteger start = pri.bigRandom(numDigits);
- BigInteger big = pri.nextPrime(start);
- e = big;
- while (e.compareTo(t) == 1 || fun(e, t)) {
- System.out.println("e不合要求,请重新产生" + (e.compareTo(t) == 1)
- + fun(e, t));
- pri = new Prime();
- try {
- numDigits = Integer.parseInt("15");
- } catch (Exception e1) {
- numDigits = 128;
- }
- start = pri.bigRandom(numDigits);
- big = pri.nextPrime(start);
- e = big;
- }
- // 求出私钥d
- d = siyue(e, t);
- System.out.println("由计算机随机产生2个素数p,q,分别如下:");
- System.out.println(p);
- System.out.println(q);
- System.out.println("计算得到的n:");
- System.out.println(n);
- System.out.println("计算得到的t:");
- System.out.println(t);
- System.out.println("随机产生的公钥:");
- System.out.println(e);
- System.out.println("由扩展的欧几里德算法求得私钥:");
- System.out.println(d);
- while (true) {
- System.out.println("请输入明文:");
- String mess = input.nextLine();
- //
- BigInteger m = new BigInteger(mess.getBytes());// 把字串转成一个BigInteger对象
- System.out.println("明文的大整数表示形式:" + m);
- /** 调用函数计算信息,统计信息 */
- mess = m.toString();
- System.out.println("计算得明文熵:" + entropy(mess));
- // 修改第一位,+1
- c = m.modPow(e, n);// JAVA中的方法
- System.out.println("密文的大整数表示形式:" + c);
- System.out.println("计算得密文熵:" + entropy(c.toString()));
- System.out.println("密文的字符串表示形式:" + new String(c.toByteArray()));
- m = c.modPow(d, n);
- System.out.println("解密得到明文的大整数表示形式:" + c);
- String str = new String(m.toByteArray());// 把返回的结果还原成一个字串
- System.out.println("解密得到明文为:" + str);
- }
- }
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|