Intentando comprender el tamaño de la clave Java RSA

El generador de claves se inició con un tamaño de 1024, ¿por qué los tamaños impresos son 635 y 162?

import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; public class TEST { public static KeyPair generateKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC"); keyPairGenerator.initialize(1024); return keyPairGenerator.generateKeyPair(); } public static void main(String[] args) throws Exception { KeyPair keyPair = generateKeyPair(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); System.out.println("Size = " + privateKey.getEncoded().length); System.out.println("Size = " + publicKey.getEncoded().length); } } 

Las claves RSA están hechas de módulo y exponente. El tamaño de la clave se refiere a los bits en el módulo. Por lo tanto, incluso sin ninguna sobrecarga de encoding, necesitará más de 128 bytes para almacenar claves de 1024 bits.

getEncoded () devuelve objetos codificados ASN.1 DER. La clave privada incluso contiene parámetros CRT, por lo que es muy grande.

Para obtener el tamaño de la clave, hacer algo como esto,

 System.out.println("Key size = " + publicKey.getModulus().bitLength()); 

Aquí están los objetos relevantes de ASN.1,

 RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q exponent1 INTEGER, -- d mod (p-1) exponent2 INTEGER, -- d mod (q-1) coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL } RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER -- e } 

Primera pista: 1024 bits = 128 bytes

Segunda sugerencia: privateKey.getEncoded() devuelve una representación encoded (es decir, no en bruto).