如何在 Java 中获取 RSA 密钥的大小

2022-09-05 00:20:44

给定一个java.security.interfaces.RSAKey,我如何获得它的大小?


答案 1

你可以试试这个:

key.getModulus().bitLength();

答案 2

(编辑:在我理解对为RSA密钥生成的素数施加的限制之前,我写了这个响应。http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf我现在相信任何好的密钥生成器都应该确保模数在2^(n-1)和2^n-1之间。因此,模数的最小二进制补码表示将始终具有在创建密钥时为密钥长度指定的位数。因此,例如,如果您创建一个 2048 位密钥,则 key.getModulus().bitLength() 将始终返回 2048。

原谅,但是当模数的最高有效位为0时,不会返回不正确的值?例如,对于 2048 位密钥,如果模数的最高有效位为 0,则返回 2047(如果更多位为 0,则返回更小)。我认为在这种情况下,理想的结果实际上是2048年。key.getModulus().bitLength()key.getModulus().bitLength()

BigInteger.bitLength() 的文档如下:

返回此 BigInteger 的最小二进制补码表示形式的位数,不包括符号位。对于正 BigIntegers,这相当于普通二进制表示中的位数。(Computes (ceil(log2(this < 0 ? -this : this+1)))

恐怕人们需要对密钥的大小做出一些假设。例如,您必须假设您只能看到 1024、2048 或 4096 位密钥,然后执行如下操作:

int keySize;
int bitLength = key.getModulus().bitLength();
if (bitLength <= 512) {
  throw new IllegalArgumentException(...)
}
else if (bitLength <= 1024) {
  keySize = 1024;
}
else if (bitLength <= 2048) {
  keySize = 2048;
}
else if (bitLength <= 4096) {
  keySize = 4096;
}
else {
  throw new IllegalArgumentException(...)
}
return keySize;

此代码在(非常罕见)情况下仍然可能是错误的,例如,当 2048 位密钥的前 1048 位全部为 0 时。不过,我认为这没什么好担心的。


推荐