Почему мой открытый ключ RSA 2048 имеет длину 294 байта?

Если я сделаю это:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.genKeyPair();
Key publicKey = kp.getPublic();
byte [] pubKey = publicKey.getEncoded();
System.out.println("Size: " + pubKey.length);

Мое выходное значение равно 294. Разве вывод RSA 2048 не должен иметь длину 256 байт?


person João Rodrigues    schedule 28.10.2014    source источник


Ответы (2)


Ключ RSA не состоит из случайных байтов, как, например, ключ AES; он состоит из цифр. Размер ключа RSA определяется модулем, но также требует общедоступного показателя степени (обычно четвертого числа Ферма или другого небольшого простого числа). Таким образом, с getEncoded() оба возвращаются встроенными в массив байтов в кодировке ASN.1 DER, который обычно присутствует в сертификатах X5.09 с именем SubjectPublicKeyInfo.

Если вы хотите извлечь размер ключа, используйте вместо него ((RSAPublicKey) publicKey).getModulus().bitLength(). Чтобы взглянуть на структуру, используйте openssl asn1parse или онлайн-декодер, например этот.

person Maarten Bodewes    schedule 28.10.2014

  publicKey.getEncoded();

Это вернет закодированный ключ в стандартном формате с некоторыми накладными расходами (например, идентификатором алгоритма).

Если вам действительно нужен необработанный ключевой материал, вы можете привести к RSAPublicKey и вызвать getModulus() и getPublicExponent() (дает вам BigInteger).

person Thilo    schedule 28.10.2014