Учитывая java.security.interfaces.RSAKий, как мне получить его размер?
Как получить размер ключа RSA в Java
Ответ 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. Я думаю, что это не о чем беспокоиться.