Как получить размер ключа RSA в Java

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

Ответ 1

Вы можете попробовать следующее:

key.getModulus().bitLength();

Ответ 2

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

Ответ 3

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

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

Документация для BigInteger.bitLength() читается следующим образом:

Возвращает количество бит в минимальном двухкомпонентном представлении этого BigInteger, исключая бит знака. Для положительных BigIntegers это эквивалентно количеству бит в обычном двоичном представлении. (Вычисляет (ceil (log2 (это & ​​lt; 0? -this: this + 1))).)

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