Как получить размер ключа RSA в Java - PullRequest
9 голосов
/ 27 мая 2010

Учитывая java.security.interfaces.RSAKey, как я могу получить его размер?

Ответы [ 3 ]

23 голосов
/ 27 мая 2010

Вы можете попробовать это:

key.getModulus().bitLength();
4 голосов
/ 17 декабря 2013

(РЕДАКТИРОВАТЬ: я написал этот ответ, прежде чем я понял ограничения, наложенные на простые целые числа, которые генерируются для ключа RSA. http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf Теперь я считаю, что любой хороший генератор ключей должен гарантировать, что модуль находится между 2 ^ (n-1) и 2 ^ n-1. Таким образом, минимальное представление модуля с двумя дополнительными компонентами всегда будет иметь именно то количество бит, которое было указано для длины ключа во время создания ключа. Так, например, если вы создаете 2048-битный ключ, то key.getModulus (). bitLength () всегда будет возвращать 2048.)

Простите, но разве key.getModulus().bitLength() не возвращает неправильное значение, когда самый значащий бит модуля равен 0? Например, для 2048-битного ключа, если самый значимый бит модуля равен 0, тогда key.getModulus().bitLength() вернет 2047 (или меньше, если больше битов равно 0). Я думаю, что желаемый результат в таком случае на самом деле будет 2048.

Документация для BigInteger.bitLength () гласит:

Возвращает количество бит в минимальном представлении с двумя дополнительными значениями этого BigInteger, исключая знаковый бит. Для положительных BigIntegers это эквивалентно количеству бит в обычном двоичном представлении. (Вычисляет (ceil (log2 (это <0? -Это: это + 1))).) </p>

Боюсь, что нужно сделать некоторые предположения о том, какого размера может быть ключ. Например, вам нужно будет предположить, что вы увидите только 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;

Этот код все еще может быть неправильным в (ОЧЕНЬ редком) случае, например, когда все первые 1048 бит 2048-битного ключа равны 0. Я думаю, что беспокоиться не о чем.

4 голосов
/ 27 мая 2010

Размер ключа RSA - это количество бит в его модуле, поэтому вы хотите myRSAKey.getModulus().bitLength().

...