2010-05-27 24 views
10

Anahtar üreteci 1024 boyutunda başlatıldı, bu nedenle yazdırılan boyutlar neden 635 ve 162'dir?Java RSA anahtar boyutunu anlamaya çalışmak

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

    } 

} 

cevap

20

RSA anahtarları Modül ve Üslerden yapılmıştır. Anahtar boyutu, modül içindeki bitlere karşılık gelir. Yani, kodlama kodlaması olmadan bile, 1024 bit anahtarların saklanması için 128 bayttan fazlasına ihtiyacınız olacaktır.

getEncoded(), ASN.1 DER kodlu nesneleri döndürür. Özel anahtar bile CRT parametrelerini içerir, bu yüzden çok büyüktür. İşte

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

ilgili asn.1 nesnelerdir

anahtar boyutunu bulmak için böyle bir şey yapmak, ipucu 2 için

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

, örnek koddaki boyutunu nasıl kontrol edebilirim? –

+0

Düzenlemelere bakın ...... –

4

ilk ipucu: 1024 bits = 128 bytes

ikinci ipucu: bir encoded temsil (yani ham olan) geri privateKey.getEncoded().

+1

teşekkürler, bu yüzden çiğ nasıl alabilirim? –

+2

"Anahtar boyutu" farklı kodlayıcılar için farklı şeyler anlamına gelir ve anahtarla ilgili önemsiz değildir. RSA durumunda, modülün büyüklüğüdür. (GetModulus() kullanmalısınız) Bkz. ZZ Coder'in cevabı. – leonbloy

+0

bir sorun var, getModulus 309 basamaklı bir sayı döndürüyor. Eğer bu, büyüklük 309 ise, onun hala ne olduğu anlaşılmamıştır (1024). –

İlgili konular