Java 卡 RSAPrivateCrtKey 私有指数 "d"
Java Card RSAPrivateCrtKey Private Exponent "d"
基于 http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/security/RSAPrivateCrtKey.html 我可以得到:
- P,质因数p
- Q,质因数q
- PQ = q-1 mod p
- DP1 = d mod (p - 1)
- 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);
}
祝你好运!
基于 http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/security/RSAPrivateCrtKey.html 我可以得到:
- P,质因数p
- Q,质因数q
- PQ = q-1 mod p
- DP1 = d mod (p - 1)
- 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);
}
祝你好运!