1

我正在编写一些 Junit 测试,其中生成了许多 java.security.KeyPair 类型的对象(来自 java.security.KeyPairGenerator)

我正在添加一些断言以确认这些 KeyPair 中包含的密钥具有预期的属性(预期的算法和预期的大小)。

例如,我添加了一个断言语句来确认该算法是预期的算法,使用:

String expectedAlgorithm = "RSA";
String errorMsg = "The key is not of the expected algorithm";
assertEquals(errorMsg, expectedAlgorithm, privateKey.getAlgorithm());

我试图在 KeyPair 或 Keys 本身中找到一些返回密钥大小(位数)的方法,但我找不到这样的方法。

我检查了键的 toString() 方法的输出,以查看该字符串是否包含键的大小,使用:

String stringRepresentation = publicKey.toString();

我发现对于 SunRsaSign 提供程序,该字符串包含其第一行中的位数(因此可以通过解析此字符串来确认密钥大小。但是当我检查 Bouncy Castle 的相同方法时,我发现字符串不包含位数,如下图:

来自 RsaSunSign 提供程序的密钥上的 toString() 输出:

Sun RSA public key, 1024 bits
  modulus: 10827493886854...
  public exponent: 65537

来自 Bouncy Castle Provider 的键上的 toString() 输出:

RSA Public Key
            modulus: 830d0eb805c527e8...
    public exponent: 10001

因此,使用密钥的字符串表示形式的输出来确认其大小显然是不安全的,因为我们不知道将使用哪个提供程序。

所以我的问题是:给定一个 KeyPair(并且还给出了用于生成该 KeyPair 的 KeyPairGenerator),是否有提供者中立的方法来确认 KeyPair 中密钥的大小?

4

1 回答 1

0

RSA 密钥的大小定义为模数中的位数。请注意,模数是以介于 2 ^ (n - 1) 和 2 ^ n - 1(含)之间的方式生成的,因此它不能小于密钥大小。

因此,要获取公共或私有 RSA 密钥的密钥大小,请执行以下操作:

int keysize = RSAPublicKey.getModulus().bitLength();

在访问模数之前,您可能必须(向下)将PublicKeyorPrivateKey转换为RSAPublicKeyand键。RSAPrivate

通常位大小在字节边界上,即位大小可以除以 8。

于 2014-07-04T00:08:24.177 回答