代码之家  ›  专栏  ›  技术社区  ›  Student

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

  •  10
  • Student  · 技术社区  · 16 年前

    给定java.security.interfaces.rsakey,如何获取其大小?

    3 回复  |  直到 11 年前
        1
  •  22
  •   David M    16 年前

    你可以试试这个:

    key.getModulus().bitLength();
    
        2
  •  4
  •   Jacob Mattison    16 年前

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

        3
  •  4
  •   John L    11 年前

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

    对不起,但是没有 key.getModulus().bitLength() 当模的最高有效位为0时,返回错误的值?例如,对于2048位密钥,如果模的最高有效位为0,则 key.getmodules().bit长度()) 将返回2047(如果更多位为0,则小于或等于2047)。我认为在这种情况下,预期的结果实际上是2048年。

    文件 BigInteger.bitLength() 内容如下:

    返回此大整数的最小二补表示形式中的位数,不包括符号位。对于正的大整数,这相当于普通二进制表示中的位数。(计算(CEIL(log2)(此<0?-这个:这个+1)))。

    恐怕我们需要对钥匙的尺寸做一些假设。例如,您必须假设您只能看到10242048或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。不过,我认为这不是什么值得担心的事情。