(РЕДАКТИРОВАТЬ: я написал этот ответ, прежде чем я понял ограничения, наложенные на простые целые числа, которые генерируются для ключа 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. Я думаю, что беспокоиться не о чем.