Java 卡 RSAPrivateCrtKey 私有指数 "d"

Java Card RSAPrivateCrtKey Private Exponent "d"

基于 http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/security/RSAPrivateCrtKey.html 我可以得到:

  1. P,质因数p
  2. Q,质因数q
  3. PQ = q-1 mod p
  4. DP1 = d mod (p - 1)
  5. DQ1 = d mod (q - 1)

通过调用每个 getter。但是,如何获得私有指数 "d"?我应该手动计算私有指数 "d",还是有任何简单的方法可以从 RSAPrivateCrtKey 获取私有指数 "d"? 反正这只是为了锻炼,不会有什么坏处。

编辑: 我真的需要私有指数 "d" 来从 XML 制作 PEM 文件。仅供参考,这只是一个练习,我只是想证明 Java Card 中 RSAPrivateCrtKey 的真实性与现实世界中的 RSAPrivateCrtKey 相同(如在 OpenSSL 等中)。还有其他方法可以证明吗?或者,有没有其他方法可以从没有私有指数的 RSAPrivateCrtKey 制作 PEM 文件 "d"?

您不需要私有指数,因为您使用 javacard.security.KeyBuilder 和 TYPE_RSA_CRT_PRIVATE 选项构建密钥对。调用 buildKey 方法会 return RSAPrivateCrtKey 的一个实例,它有足够的 public 方法来执行任何计算。

如果您想了解有关算法本身的一些详细信息(以及如何找到 d、p、q 等),您可以在网上找到大量文章,例如这篇文章: http://www.techscience.com/doi/10.3970/icces.2008.005.255.pdf

这个应该可以工作(源自 Bouncy Castle 的 RSAKeyPairGenerator.java 并使用一个 RSA 私钥验证):

public static BigInteger getPrivateExponent(byte[] publicExponentBytes, byte[] pBytes, byte[] qBytes) {
    BigInteger e = new BigInteger(1, publicExponentBytes);
    BigInteger p = new BigInteger(1, pBytes);
    BigInteger q = new BigInteger(1, qBytes);

    BigInteger pSub1 = p.subtract(BigInteger.ONE);
    BigInteger qSub1 = q.subtract(BigInteger.ONE);
    BigInteger phi = pSub1.multiply(qSub1);
    return e.modInverse(phi);
}

祝你好运!