java - 如何在 Java 中生成 RSA key

标签 java encryption rsa key-generator

我得到了这个代码来通过 RSA 加密/解密一些字符串。该项目用于了解加密,仅出于学习目的而构建。到目前为止,我一直使用固定 key 来使用我的应用程序,但现在我想构建一种方法,根据输入的位大小生成有效 key 。

这是我当前的类(class):

import java.math.BigInteger;
import java.util.Random;

public class RSAWorker {

    public static BigInteger gcdExtended(BigInteger a, BigInteger b) {
        BigInteger a_cur = BigInteger.ONE;
        BigInteger b_cur = BigInteger.ZERO;
        BigInteger a_next = BigInteger.ZERO;
        BigInteger b_next = BigInteger.ONE;
        BigInteger q;
        BigInteger r;

        do {
            q = a.divide(b);
            r = a.subtract(q.multiply(b));
            BigInteger tmpA = a_next;
            BigInteger tmpB = b_next;
            a_next = a_cur.subtract(q.multiply(a_next));
            b_next = b_cur.subtract(q.multiply(b_next));
            a_cur = tmpA;
            b_cur = tmpB;
            a = b;
            b = r;
        } while (r.intValue() > 0);

        return a_cur;
    }

    public static char separator = '_';
    private BigInteger e = BigInteger.ZERO;
    private BigInteger d = BigInteger.ZERO;
    private BigInteger n = BigInteger.ZERO;

    private ProgressInformant progressSupervisor;

    private void inform(long index, long max) {
        if (progressSupervisor != null) {
            progressSupervisor.prograssAt(Math.round((float) index / max * 100));
        }
    }

    public void generateKeys(int bitSize) {
       e = 65537;
       d = 1873890542004290369;
       n = 11495756297295397069;
    }

    public BigInteger encode(BigInteger c) {
        return c.modPow(e, n);
    }

    public BigInteger decode(BigInteger c) {
        return c.modPow(d, n);
    }

    public String encode(String str) {
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            result.append(encode(BigInteger.valueOf(c)));
            result.append(separator);
            inform(i + 1, str.length());

            if (Thread.interrupted()) {
                return null;
            }
        }

        return result.toString();
    }

    public String decode(String str) {
        StringBuilder result = new StringBuilder();

        String[] tokens = str.split(separator+"+");

        for (int i = 0; i < tokens.length; i++) {
            String s = tokens[i];
            result.append((char) decode(new BigInteger(s)).intValue());
            inform(i + 1, tokens.length);

            if (Thread.interrupted()) {
                return null;
            }
        }

        return result.toString();
    }

    public ProgressInformant getProgressSupervisor() {
        return progressSupervisor;
    }

    public void setProgressSupervisor(ProgressInformant progressSupervisor) {
        this.progressSupervisor = progressSupervisor;
    }

    public BigInteger getE() {
        return e;
    }

    public void setE(BigInteger e) {
        this.e = e;
    }

    public BigInteger getD() {
        return d;
    }

    public void setD(BigInteger d) {
        this.d = d;
    }

    public BigInteger getN() {
        return n;
    }

    public void setN(BigInteger n) {
        this.n = n;
    }
}

最佳答案

看看这篇维基百科文章:RSA Key Generation

它逐步向您展示如何生成有效 key 。

public void generateKeys(int bitSize) {
    Random rnd = new Random();
    //1
    BigInteger p = BigInteger.probablePrime(bitSize, rnd);
    BigInteger q = BigInteger.probablePrime(bitSize, rnd);

    //2
    n = p.multiply(q);

    //3
    BigInteger euler = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));

    //4
    BigInteger x = BigInteger.valueOf(65537);

    do {
        if (euler.gcd(x).equals(BigInteger.ONE)) {
            e = x;
            //5
            d = gcdExtended(e, euler);
            if (d.signum() == 1) {
                break;
            }
        }
        x = x.add(BigInteger.ONE);
    } while (true);
}
  1. 选择两个不同的素数 p 和 q(通过 probablePrime)
  2. 计算 n = pq
  3. 欧拉函数 (http://en.wikipedia.org/wiki/Euler%27s_totient_function)
  4. 选择 e(作为公钥指数)
  5. 通过现有的 gcdExtended 方法(扩展欧几里得算法)确定 d

关于java - 如何在 Java 中生成 RSA key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29730938/

相关文章:

java - 具有 RESTFul API 和静态 Web 的独立 Java 应用程序

java - 如何使用TreeNode打印PostOrder和PreOrder?

java - 无需子类继承减少代码重复

GSM 语音通信中的加密

c# - 如何在 C# 中读取加密的 sqlite 数据库

ruby-on-rails - ruby OpenSSL RSA 字符编码

java - 图形程序适用于 Windows,但不适用于 Mac

python - 存储 MySQL 密码

python 加密 rsa 问题

delphi - 需要一个允许我使用 RSA 加密/解密某些文本的 Delphi 组件/库