|

楼主 |
发表于 2022-5-3 23:34:05
|
显示全部楼层
本帖最后由 徐柳婧 于 2022-5-30 19:09 编辑
一、RSA算法描述
(1)任意选取两个不同的大素数p和q计算乘积
;
(2)任意选取一个大整数e,满足,整数e用做加密钥 ;
(3)确定的解密钥d,满足,即 是一个任意的整数;所以,若知道e和,则很容易计算出d ;
(4)公开整数n和e,秘密保存d ;
(5)将明文m(m<n是一个整数)加密成密文c,加密算法为
(6)将密文c解密为明文m,解密算法为
二、源代码
node.java
- 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;
- }
- }
复制代码 prime.java
- public class Prime {
- public boolean sushu(double n) {
- boolean isPrime = true;
- if (n > 2) {
- 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) {
- }
- }
复制代码 RSA.java
- 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 = siyue(e, t);
- System.out.println("随机产生两个素数:"+p+" "+q);
- System.out.println("随机产生公钥:"+e);
- System.out.println("由扩展的欧几里德算法求得私钥:"+d);
- while (true) {
- System.out.print("请输入明文:");
- String mess = input.nextLine();
- BigInteger m = new BigInteger(mess.getBytes());
- System.out.println("明文的大整数形式:" + m);
- /** 调用函数计算信息,统计信息 */
- mess = m.toString();
- System.out.println("明文熵:" + entropy(mess));
- c = m.modPow(e, n);
- 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
|