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

Tom*_*ito 9 java rsa

鉴于java.security.interfaces.RSAKey,我如何获得它的大小?

Dav*_*d M 23

你可以试试这个:

key.getModulus().bitLength();
Run Code Online (Sandbox Code Playgroud)


Joh*_*n L 5

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

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

BigInteger.bitLength()的文档内容如下:

返回此 BigInteger 的最小二进制补码表示形式的位数,不包括符号位。对于正 BigIntegers,这相当于普通二进制表示中的位数。(计算 (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;
Run Code Online (Sandbox Code Playgroud)

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