Tenho uma chave pública EC (acho que é pkcs#8 PEM, mas não tenho certeza porque não estou muito familiarizado com esses termos):
-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE10Hdyc6k1jVb0ex4xYgbmxfF07+PLyuK
PNHsmOjQqm1FDYifXb4xnDrTcjJbzb/y4+zWg1RIsHe3xqdN+zo3QJcm3GwbZp18
CMegoNmpmAP35l9djXMV9cY1cg/iDmbs
-----END PUBLIC KEY-----
Agora preciso convertê-lo para DER.
Primeiro eu digitei o seguinte comando:
openssl ec -pubin -pubout -in key.pem -text
e obtive esta saída:
read EC key
Public-Key: (384 bit)
pub:
04:d7:41:dd:c9:ce:a4:d6:35:5b:d1:ec:78:c5:88:
1b:9b:17:c5:d3:bf:8f:2f:2b:8a:3c:d1:ec:98:e8:
d0:aa:6d:45:0d:88:9f:5d:be:31:9c:3a:d3:72:32:
5b:cd:bf:f2:e3:ec:d6:83:54:48:b0:77:b7:c6:a7:
4d:fb:3a:37:40:97:26:dc:6c:1b:66:9d:7c:08:c7:
a0:a0:d9:a9:98:03:f7:e6:5f:5d:8d:73:15:f5:c6:
35:72:0f:e2:0e:66:ec
ASN1 OID: secp384r1
NIST CURVE: P-384
É exatamente o que eu quero, como você pode ver, esse comando exibe uma sequência de números HEX, que é exatamente o que eu quero.
Mas quando tento salvar essa saída em um arquivo usando este comando:
openssl ec -pubin -in key.pem -out out.der -outform DER
ele salva algo diferente (ele apenas decodifica o base64 dentro dos blocos ---begin-- e ----end---- e salva o resultado em um arquivo, o que não é desejado para mim).
Alguém pode me ajudar a converter essa chave pública em assinatura bruta/binária e vice-versa? Eu realmente preciso disso e, além disso, posso saber como converter uma assinatura bruta em uma chave pública PEM assim?
Desde já, obrigado.
A chave publicada é uma chave codificada PEM no formato X.509/SPKI para a curva secp384r1. Isso pode ser convertido em uma chave codificada DER com a declaração OpenSSL publicada:
Essa conversão corresponde à remoção do cabeçalho, rodapé, todas as quebras de linha e decodificação Base64 do restante.
No final da chave codificada DER está a chave pública em formato não compactado (referido como
pub
na impressão OpenSSL via-text
opção). O formato não compactado para secp384r1 tem um comprimento de 97 bytes (0x04|<x>|<y>
;<x>
e<y>
são as coordenadas do ponto EC, cada um com 384/8=48 bytes de comprimento).Portanto, para extrair a chave não compactada da chave codificada DER, apenas os últimos 97 bytes precisam ser tomados.
Os primeiros 23 bytes contêm informações de comprimento e OIDs de algoritmo. Essa sequência de bytes é específica da curva e suas informações de comprimento especificam uma chave em formato não compactado (ou seja, a sequência de bytes de uma curva diferente e/ou uma chave em formato compactado seriam diferentes). Portanto, ela pode ser usada como um prefixo para converter uma chave secp384r1 em formato não compactado em uma chave codificada DER em formato X.509/SPKI.
O OpenSSL não suporta (até onde sei) a conversão direta de chaves públicas codificadas em PEM/DER para o formato descompactado (ou compactado) ou vice-versa.
Para fins de completude: Com a opção
-conv_form compressed
na declaração OpenSSL acima, o formato compactado (<a>|<x>
, com<a> = 0x02
for even<y>
e<0x03>
for odd<y>
) pode ser usado em vez do formato descompactado. Isso tem um comprimento de 49 bytes para secp384r1.Uma chave codificada DER (ou PEM) pode ser facilmente analisada quando decodificada com um analisador ASN.1/DER, por exemplo, aqui para a chave publicada.