Attualmente sto cercando di rendere il mio server web il più sicuro possibile e sto testando diversi pacchetti di crittografia sul lato server, alcuni dei quali utilizzano lo scambio di chiavi ECDHE.
Durante la generazione di chiavi EC private, ho notato che la maggior parte dei dati generati è identica quando si generano due chiavi. L'output non elaborato:
root@spock:/etc/letsencrypt/live/binarus.home.omeganet.de# openssl ecparam -name secp256k1 -param_enc explicit -genkey
-----BEGIN EC PARAMETERS-----
MIGiAgEBMCwGByqGSM49AQECIQD////////////////////////////////////+
///8LzAGBAEABAEHBEEEeb5mfvncu6xVoGKVzocLBwKb/NstzijZWfKBWxb4F5hI
Otp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuAIhAP//////////////////
//66rtzmr0igO7/SXozQNkFBAgEB
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MIIBEwIBAQQgpCZwVgJpH7t70lK0V1MSGvCe8IcOtXPP+S/luqFsr/eggaUwgaIC
AQEwLAYHKoZIzj0BAQIhAP////////////////////////////////////7///wv
MAYEAQAEAQcEQQR5vmZ++dy7rFWgYpXOhwsHApv82y3OKNlZ8oFbFvgXmEg62ncm
o8RlXaT7/A4RCKj9F7RIpoVUGZxH0I/7ENS4AiEA/////////////////////rqu
3OavSKA7v9JejNA2QUECAQGhRANCAASXlnk1RIp1fKlGxcZMsm0mJLJ6xoIG4Z8t
AYn30X5pA3P00BpweidnzeqLlytPBuFeqwbJBuH3rXnpIvMe2W89
-----END EC PRIVATE KEY-----
root@spock:/etc/letsencrypt/live/binarus.home.omeganet.de# openssl ecparam -name secp256k1 -param_enc explicit -genkey
-----BEGIN EC PARAMETERS-----
MIGiAgEBMCwGByqGSM49AQECIQD////////////////////////////////////+
///8LzAGBAEABAEHBEEEeb5mfvncu6xVoGKVzocLBwKb/NstzijZWfKBWxb4F5hI
Otp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuAIhAP//////////////////
//66rtzmr0igO7/SXozQNkFBAgEB
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MIIBEwIBAQQgXccG/nHnL17f60wwQq7zwngdSIg9c+ATwy2CSMY+2PWggaUwgaIC
AQEwLAYHKoZIzj0BAQIhAP////////////////////////////////////7///wv
MAYEAQAEAQcEQQR5vmZ++dy7rFWgYpXOhwsHApv82y3OKNlZ8oFbFvgXmEg62ncm
o8RlXaT7/A4RCKj9F7RIpoVUGZxH0I/7ENS4AiEA/////////////////////rqu
3OavSKA7v9JejNA2QUECAQGhRANCAASzr/OIB4ab1o6++PPJCg/TdbdmDHIiYxOD
Gi7hfp5VGe8d++PrAb3B5Pnvn2TmrDsbNzeysGp0IPjpH+ns56vn
-----END EC PRIVATE KEY-----
Come puoi vedere, la maggior parte della chiave privata è identica. Ma la mia comprensione della generazione di una chiave privata è sempre stata che ogni chiave privata dovrebbe essere unica. Qualcuno potrebbe far luce su questo?
Si noti che l'ho osservato con una versione diversa di OpenSSL, tra cui la più recente (OpenSSL 1.0.2e). Si noti inoltre che il risultato è lo stesso se elimini lo switch della riga di comando -param_enc esplicito.
Mentre almeno ci sono alcuni byte diversi nei risultati sopra, sono completamente perso quando consento a OpenSSL di tradurre i dati generati in forma leggibile:
root@spock:/etc/letsencrypt/live/binarus.home.omeganet.de# openssl ecparam -name secp256k1 -param_enc explicit -genkey | openssl asn1parse
0:d=0 hl=3 l= 162 cons: SEQUENCE
3:d=1 hl=2 l= 1 prim: INTEGER :01
6:d=1 hl=2 l= 44 cons: SEQUENCE
8:d=2 hl=2 l= 7 prim: OBJECT :prime-field
17:d=2 hl=2 l= 33 prim: INTEGER :FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
52:d=1 hl=2 l= 6 cons: SEQUENCE
54:d=2 hl=2 l= 1 prim: OCTET STRING [HEX DUMP]:00
57:d=2 hl=2 l= 1 prim: OCTET STRING [HEX DUMP]:07
60:d=1 hl=2 l= 65 prim: OCTET STRING [HEX DUMP]:0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
127:d=1 hl=2 l= 33 prim: INTEGER :FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
162:d=1 hl=2 l= 1 prim: INTEGER :01
root@spock:/etc/letsencrypt/live/binarus.home.omeganet.de# openssl ecparam -name secp256k1 -param_enc explicit -genkey | openssl asn1parse
0:d=0 hl=3 l= 162 cons: SEQUENCE
3:d=1 hl=2 l= 1 prim: INTEGER :01
6:d=1 hl=2 l= 44 cons: SEQUENCE
8:d=2 hl=2 l= 7 prim: OBJECT :prime-field
17:d=2 hl=2 l= 33 prim: INTEGER :FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
52:d=1 hl=2 l= 6 cons: SEQUENCE
54:d=2 hl=2 l= 1 prim: OCTET STRING [HEX DUMP]:00
57:d=2 hl=2 l= 1 prim: OCTET STRING [HEX DUMP]:07
60:d=1 hl=2 l= 65 prim: OCTET STRING [HEX DUMP]:0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
127:d=1 hl=2 l= 33 prim: INTEGER :FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
162:d=1 hl=2 l= 1 prim: INTEGER :01
Ora tutte le STRINGATE OCTET sono esattamente le stesse. A mio avviso, una di queste dovrebbe essere la chiave privata, non dovrebbe?
Sarei grato per qualsiasi spiegazione. Ho un background matematico e di programmazione e ho compreso i concetti alla base della crittografia asimmetrica basata su RSA. Ma non ho quasi nessuna conoscenza della crittografia a curve ellittiche. Voglio solo usarlo per lo scambio di chiavi ECDHE al fine di rafforzare le query HTTPS con perfetta segretezza in avanti.
Grazie mille in anticipo ...