Учитывая KeyPair, как я могу убедиться, что ключи, содержащиеся в этой KeyPair, имеют ожидаемую длину?

Я пишу несколько тестов 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 или в самих ключах, который возвращает размер (количество бит) ключей, но я не смог найти такой метод.

Я проверил вывод метода toString() ключей, чтобы увидеть, содержит ли эта строка размер ключей, используя:

String stringRepresentation = publicKey.toString();

Я обнаружил, что для поставщика SunRsaSign строка содержит количество битов в своей первой строке (и, следовательно, можно подтвердить размер ключа путем разбора этой строки. Но затем, когда я проверил тот же метод для Bouncy Castle, я обнаружил, что строка не содержит количество битов, как показано ниже:

Вывод toString() для ключа от поставщика RsaSunSign:

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

Вывод toString() для ключа от поставщика Bouncy Castle:

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

Таким образом, очевидно, небезопасно использовать вывод строкового представления ключа для подтверждения его размера, поскольку мы не можем знать, какой провайдер будет использоваться.

Итак, мой вопрос: учитывая KeyPair (а также KeyPairGenerator, который использовался для создания этой KeyPair), существует ли независимый от поставщика способ подтвердить размер ключей в KeyPair?


person user3441604    schedule 16.04.2014    source источник


Ответы (1)


Размер ключа RSA определяется как количество битов в модуле. Обратите внимание, что модуль генерируется таким образом, что он находится между 2 ^ (n - 1) и 2 ^ n - 1 (включительно), поэтому он не может быть меньше размера ключа.

Итак, чтобы получить размер открытого или закрытого ключа RSA, вы делаете следующее:

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

Возможно, вам придется (вниз) преобразовать ключ PublicKey или PrivateKey в ключ RSAPublicKey и RSAPrivate, прежде чем вы сможете получить доступ к модулю.

Обычно размер бита находится на границе байта, т. е. размер бита можно разделить на 8.

person Maarten Bodewes    schedule 04.07.2014