给定KeyPair,如何验证此KeyPair中包含的密钥是否为预期长度?

时间:2014-04-16 09:38:57

标签: java security cryptography jca key-pair

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

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

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

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提供程序,该字符串包含其第一行中的位数(因此可以通过解析此String来确认密钥大小。但是当我为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

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

所以我的问题是:给定一个KeyPair(并且还给出了用于生成KeyPair的KeyPairGenerator),是否有一种与提供者无关的方式来确认KeyPair中Key的大小?

1 个答案:

答案 0 :(得分:0)

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

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

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

您可能必须(向下)将PublicKeyPrivateKey转换为RSAPublicKeyRSAPrivate密钥,然后才能访问模数。

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