当前位置: 首页 > 知识库问答 >
问题:

如何从RSaprivateKey获取RSAPrivateCrtKey?

米承嗣
2023-03-14

我有一个java.security.interfaces.rsaprivateKey和相应的java.security.interfaces.rsapublicKey(仅包含)模、私有指数和公共指数。

如果我正确理解RSA,应该可以恢复java.security.interfaces.RSAPrivateCrtKey(用于CRT密钥)的数字。

如果是,我该怎么做?(我假设已经有了一些实现)。

共有1个答案

颛孙炜
2023-03-14

这样做是可能的,并且有一个相对快速的算法来找到参数。下面是一些说明该算法的Java代码。

/**
 * 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) > 0) {
        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);

}
 类似资料:
  • 如何从(在清单中)使用java?

  • 问题内容: 我正在使用蜡染来处理SVG图像。有什么办法可以从SVG文件中获取java.awt.image.BufferedImage吗? 我知道有一些转码器,我可以使用它们将SVG转码为PNG,然后使用ImageIO.read()加载该PNG,但是我不想拥有临时文件。 问题答案: 使用蜡染,如下所示:

  • 问题内容: 我正在使用HttpClient 4.1.2 那么,如何获取Cookie值? 问题答案: 请注意:第一个链接指向曾经在HttpClient V3中工作的内容。在下面找到与V4相关的信息。 这应该回答你的问题 http://www.java2s.com/Code/Java/Apache- Common/GetCookievalueandsetcookievalue.htm 以下与V4有关:

  • 问题内容: 如何从BufferedImage对象获取InputStream?我尝试了这个,但是ImageIO.createImageInputStream()总是返回NULL 图片缩略图已正确生成,因为我可以成功将 bigImage绘制 到 JPanel 。 谢谢。 问题答案: 如果您尝试将图像保存到文件,请尝试: 如果您只想读取字节,请尝试执行写调用,但将其传递给ByteArrayOutputS

  • 问题内容: 我想从java.io.InputStream读取超时。显然,执行此操作的正确方法是使用java.nio.channels.SelectableChannel和java.nio.channels.Selector。不幸的是,目前尚不清楚如何从InputStream转到SelectableChannel。 InputStream来自非常规来源-http://java.sun.com/pro

  • 问题内容: 是否可以从ServletContext获取HttpServletRequest? 问题答案: 是否可以从ServletContext获取HttpServletRequest? 没有。 该代表的应用程序。该应用程序可以涵盖许多会话和请求。但是您无法通过来获取“当前正在运行”的请求或会话。有关servlet和作用域如何工作的详细信息,可以在以下相关答案中找到:servlet如何工作?实例化