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

时间:2010-05-27 15:47:28

标签: java rsa

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

4 个答案:

答案 0 :(得分:22)

你可以试试这个:

key.getModulus().bitLength();

答案 1 :(得分:4)

RSA密钥的大小是其模数中的位数,因此您需要 myRSAKey.getModulus().bitLength()

答案 2 :(得分:4)

(编辑:我在理解对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时,key.getModulus().bitLength()不返回不正确的值?例如,对于2048位密钥,如果模数的最高有效位为0,则key.getModulus().bitLength()将返回2047(如果更多位为0,则返回更少)。我认为在这种情况下所希望的结果实际上是2048年。

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

  

返回此BigInteger的最小二进制补码表示中的位数,不包括符号位。对于正BigIntegers,这相当于普通二进制表示中的位数。 (计算(ceil(log2(此< 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.我认为这不是值得担心的事情。

答案 3 :(得分:1)

我同意 Wheezil 在接受的答案中提到的担忧。具有 8 个前导 0 位的模数将破坏该方法。这有 0.4% 的发生几率,这在我看来是不可接受的。所以我个人用它来代替:

import Paragraph from './Paragraph';

const typesMap = {
  'paragraph': props => <Paragraph {...props} />,
//'heading': props => ...
//'image': ... 
};

function Article({ type, model }) {
  if (!type) return null;

  const TypeComponent = typesMap[type];

  return <TypeComponent {...model} />;
}

export default Article;

...因为 RSA 输出大小始终与密钥的模数大小相同,即使输入长度为 0。