Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to understand Java RSA key size

The key generator was initilized with a size of 1024, so why the printed sizes are 635 and 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);

    }

}
like image 360
The Student Avatar asked May 27 '10 13:05

The Student


People also ask

What size RSA key should I use?

Since 2015, NIST recommends a minimum of 2048-bit keys for RSA, an update to the widely-accepted recommendation of a 1024-bit minimum since at least 2002.

How are RSA keys calculated?

Generation of RSA Key Pair Calculate n=p*q. For strong unbreakable encryption, let n be a large number, typically a minimum of 512 bits.

How many characters is a RSA key?

451 characters for public keys.


2 Answers

RSA keys are made of Modulus and Exponent. The key size refers to the bits in modulus. So even without any encoding overhead, you will need more than 128 bytes to store 1024-bit keys.

getEncoded() returns ASN.1 DER encoded objects. The private key even contains CRT parameters so it's very large.

To get key size, do something like this,

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

Here are the relevant ASN.1 objects,

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
}
like image 198
ZZ Coder Avatar answered Nov 01 '22 04:11

ZZ Coder


First hint: 1024 bits = 128 bytes

Second hint: privateKey.getEncoded() returns an encoded representation (i.e. not raw).

like image 27
leonbloy Avatar answered Nov 01 '22 05:11

leonbloy