Minha resposta abaixo é um pouco longa, mas espero que ele forneça alguns detalhes que estão faltando nas respostas anteriores. Vou começar com algumas afirmações relacionadas e, finalmente, responder à pergunta inicial.
Para criptografar algo usando o algoritmo RSA, você precisa de um módulo e um par de expoentes de criptografia (público) (n, e). Essa é a sua chave pública. Para descriptografar algo usando o algoritmo RSA, você precisa de um módulo e um par de expoentes de descriptografia (privado) (n, d). Essa é a sua chave privada.
Para criptografar algo usando a chave pública RSA, você trata seu texto sem formatação como um número e o eleva ao poder do módulo n:
ciphertext = ( plaintext^e ) mod n
Para descriptografar algo usando a chave privada RSA, você trata o texto cifrado como um número e o eleva ao poder do módulo d:
plaintext = ( ciphertext^d ) mod n
Para gerar chave privada (d, n) usando o openssl, você pode usar o seguinte comando:
openssl genrsa -out private.pem 1024
Para gerar chave pública (e, n) a partir da chave privada usando o openssl, você pode usar o seguinte comando:
openssl rsa -in private.pem -out public.pem -pubout
Para dissecar o conteúdo da chave RSA privada private.pem gerada pelo comando openssl acima, execute o seguinte (saída truncada para os rótulos aqui):
openssl rsa -in private.pem -text -noout | less
modulus - n
privateExponent - d
publicExponent - e
prime1 - p
prime2 - q
exponent1 - d mod (p-1)
exponent2 - d mod (q-1)
coefficient - (q^-1) mod p
A chave privada não deve consistir apenas em (n, d) par? Por que existem 6 componentes extras? Ele contém e (expoente público) para que a chave RSA pública possa ser gerada / extraída / derivada da chave RSA privada private.pem. Os demais 5 componentes estão lá para acelerar o processo de descriptografia. Acontece que, ao pré-computar e armazenar esses 5 valores, é possível acelerar a descriptografia do RSA pelo fator 4. A descriptografia funcionará sem esses 5 componentes, mas poderá ser feita mais rapidamente, se você os tiver à mão. O algoritmo de aceleração é baseado no teorema chinês do restante .
Sim, a chave privada RSA private.pem realmente contém todos esses 8 valores; nenhum deles é gerado rapidamente quando você executa o comando anterior. Tente executar os seguintes comandos e compare a saída:
# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der
# Print private.der private key contents as binary stream
xxd -p private.der
# Now compare the output of the above command with output
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less
Essa estrutura da chave privada RSA é recomendada pelo PKCS # 1 v1.5 como uma representação alternativa ( segunda ). O padrão PKCS # 1 v2.0 exclui os expoentes e ed da representação alternativa por completo. O PKCS # 1 v2.1 e v2.2 propõem mudanças adicionais na representação alternativa, incluindo opcionalmente mais componentes relacionados ao CRT.
Para ver o conteúdo da chave public.pem public RSA, execute o seguinte (saída truncada para rótulos aqui):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Não há surpresas aqui. É apenas (n, e) par, como prometido.
Agora, finalmente, respondendo à pergunta inicial: Como foi mostrado acima, a chave RSA privada gerada usando o openssl contém componentes das chaves pública e privada e um pouco mais. Quando você gera / extrai / deriva uma chave pública da chave privada, o openssl copia dois desses componentes (e, n) em um arquivo separado que se torna sua chave pública.