【问题标题】:Restore RSA private key by modulus, public and private exponents using Java Security使用 Java 安全性通过模数、公共和私有指数恢复 RSA 私钥
【发布时间】:2017-10-21 00:04:10
【问题描述】:

我正在尝试使用给定的参数 {e,n,d} 在 PKCS#1 中找到用于生成 RSA 私钥的 Java(本机或 BouncyCastle 提供程序)实现。

Dan Boneh 的 paper 描述了这样做的算法。该解决方案在 PyCrypto (Python) 中可用,并且 Mounir IDRASSI 发布了一个独立的utility,它可以在 SFM 格式 (n,e,d) 和 CRT 格式 (p,q,dp,dq) 之间转换 RSA 密钥,u),反之亦然。但是我找不到任何可用于 Java 的东西。

更新:我在https://github.com/martinpaljak/RSAKeyConverter/blob/master/src/opensc/RSAKeyConverter.java找到了这样的实现

【问题讨论】:

  • 我也实现了,直接在 Java 中没有查看任何其他代码,只是论文但可能借用了一些算法。但是,它在另一台计算机上。所以我假设你想转换为 CRT,因为你不完全清楚你在追求什么。

标签: rsa private-key cryptoapi java-security


【解决方案1】:

我在this 答案中提供了一些代码,我将在此处复制:

/**
 * Find a factor of n by following the algorithm outlined in Handbook of Applied Cryptography, section
 * 8.2.2(i). See http://cacr.uwaterloo.ca/hac/about/chap8.pdf.
 *
 */

private static BigInteger findFactor(BigInteger e, BigInteger d, BigInteger n) {
    BigInteger edMinus1 = e.multiply(d).subtract(BigInteger.ONE);
    int s = edMinus1.getLowestSetBit();
    BigInteger t = edMinus1.shiftRight(s);

    for (int aInt = 2; true; aInt++) {
        BigInteger aPow = BigInteger.valueOf(aInt).modPow(t, n);
        for (int i = 1; i <= s; i++) {
            if (aPow.equals(BigInteger.ONE)) {
                break;
            }
            if (aPow.equals(n.subtract(BigInteger.ONE))) {
                break;
            }
            BigInteger aPowSquared = aPow.multiply(aPow).mod(n);
            if (aPowSquared.equals(BigInteger.ONE)) {
                return aPow.subtract(BigInteger.ONE).gcd(n);
            }
            aPow = aPowSquared;
        }
    }

}

public static RSAPrivateCrtKey createCrtKey(RSAPublicKey rsaPub, RSAPrivateKey rsaPriv) throws NoSuchAlgorithmException, InvalidKeySpecException {

    BigInteger e = rsaPub.getPublicExponent();
    BigInteger d = rsaPriv.getPrivateExponent();
    BigInteger n = rsaPub.getModulus();
    BigInteger p = findFactor(e, d, n);
    BigInteger q = n.divide(p);
    if (p.compareTo(q) > 1) {
        BigInteger t = p;
        p = q;
        q = t;
    }
    BigInteger exp1 = d.mod(p.subtract(BigInteger.ONE));
    BigInteger exp2 = d.mod(q.subtract(BigInteger.ONE));
    BigInteger coeff = q.modInverse(p);
    RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(n, e, d, p, q, exp1, exp2, coeff);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return (RSAPrivateCrtKey) kf.generatePrivate(keySpec);

}

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2011-08-10
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多