Попытка понять Java размер ключа RSA

Ключевой генератор был initilized с размером 1 024, итак, почему печатные размеры 635 и 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);

    }

}
10
задан Tom Brito 27 May 2010 в 13:28
поделиться

2 ответа

Ключи 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
}
22
ответ дан 3 December 2019 в 16:09
поделиться

Первая подсказка: 1024 бита = 128 байтов

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

4
ответ дан 3 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: