2010-05-27 2 views
10

Генератор ключей был инициализирован с размером 1024, поэтому почему печатные размеры 635 и 162?Попытка понять размер ключа Java RSA

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); 

    } 

} 

ответ

20

RSA ключи изготовлены из модулей и экспонентов. Размер ключа относится к битам в модуле. Поэтому даже без каких-либо накладных расходов на кодирование вам понадобится более 128 байт для хранения 1024-битных ключей.

getEncoded() возвращает объекты с кодировкой ASN.1 DER. Частный ключ даже содержит параметры CRT, поэтому он очень большой.

Чтобы получить размер ключа, сделать что-то вроде этого,

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

Вот соответствующие объекты 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 
} 
+0

так, как я могу проверить его размер в примере кода? –

+0

См. Мои правки ...... –

4

Первый намек: 1024 bits = 128 bytes

Второй намек: privateKey.getEncoded() возвращает encoded представление (т.е. не сырье).

+1

спасибо за подсказку 2, так как я могу получить сырье? –

+2

«Размер ключа» означает разные вещи для разных кодеров и не имеет тривиального отношения к ключу. В случае RSA это размер модуля. (Вы должны использовать getModulus()) См. Ответ ZZ Coder. – leonbloy

+0

что-то не так, getModulus возвращает число 309 цифр. Если это означает, что размер равен 309, то он все еще не тот, который был установлен (1024). –

Смежные вопросы