OpenSSL Genera chiave pubblica ECDH

0

Sto cercando di utilizzare la riga di comando di OpenSSL per generare una chiave pubblica ECDH che soddisfi le seguenti specifiche:

Use a Base64 encoded X.509 SubjectPublicKeyInfo structure containing a ECDH public key for group P256

I seguenti comandi mi forniscono una chiave:

openssl ecparam -name prime256v1 -out prime256v1.pem
openssl ecparam -in prime256v1.pem -genkey -noout -out prime256v1-key.pem
openssl ec -in prime256v1-key.pem -pubout -out pubkey.pem

Key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq23h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==

Tuttavia questa chiave non viene accettata dall'API a cui sto accedendo.

Un esempio di chiave che funziona è:

MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgACKoJz0lSBocGMsdl8TiMasRsBOxpMywCqzAoOLwZfUl0=

Questa chiave di esempio è 44 byte (Base64) più corti e ha una firma SubjectPublickKeyInfo leggermente diversa.

La mia domanda è quale sia la differenza tra queste due chiavi e come potrei usare gli strumenti della riga di comando di OpenSSL per generare una tale coppia di chiavi.

    
posta PassKit 28.07.2016 - 20:48
fonte

1 risposta

3

Prova la versione compressa

Ciò che hai postato lì come "chiave di esempio che funziona" è un pubkey EC codificato in base64 senza il wrapper PEM e senza le solite interruzioni di riga. E più specificamente è una versione COMPRESSA del pubkey EC. Ma openssl scrive chiavi non compresse per impostazione predefinita .

Puoi convertire tra le versioni compresso e non compresso in questo modo:

$ cat ExampleOfRejectedKey.headerlesspem
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq23h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==

Effettua analisi openssl nella chiave

$ openssl ec -inform DER -pubin -in <(base64 -d ExampleOfRejectedKey.headerlesspem)
read EC key
writing EC key
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE85KGK3YiX7tC7mFm+Te1xRYOeDq2
3h80MPPt1nMZ/ZRpwjRGPEUr6vaoOCB8QC3uHmaPKOAgQ0Kk9Sc4M1QUmA==
-----END PUBLIC KEY-----

Ancora ma con "-conv_form compresso"

$ openssl ec -inform DER -pubin -in <(base64 -d ExampleOfRejectedKey.headerlesspem) -conv_form compressed
read EC key
writing EC key
-----BEGIN PUBLIC KEY-----
MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAC85KGK3YiX7tC7mFm+Te1xRYOeDq2
3h80MPPt1nMZ/ZQ=
-----END PUBLIC KEY-----

Come puoi vedere: è molto più breve ora. E più vicino alla chiave di lavoro. Prova questo. (Perché ogni API dovrebbe insistere su una rappresentazione compressa, e non dirlo, è oltre me.)

Ulteriori letture

Vedi questa domanda: 2011-07-12, Esiste una codifica standardizzata a lunghezza fissa per le chiavi pubbliche CE?

    
risposta data 27.12.2016 - 12:27
fonte

Leggi altre domande sui tag