Actualmente estoy tratando de hacer que mi servidor web sea lo más seguro posible y estoy probando diferentes conjuntos de cifrado en el lado del servidor, algunos de ellos utilizando el intercambio de claves ECDHE.
Al generar claves EC privadas, noté que la mayoría de los datos generados son idénticos cuando se generan dos claves. La salida en bruto:
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-----
Como puede ver, la mayoría de la clave privada es idéntica. Pero mi comprensión de generar una clave privada siempre ha sido que cada clave privada debe ser única. ¿Alguien podría arrojar algo de luz sobre esto?
Tenga en cuenta que he observado esto con diferentes versiones de OpenSSL, entre ellas la más reciente (OpenSSL 1.0.2e). Tenga en cuenta también que el resultado es el mismo si dejo de lado el interruptor de la línea de comandos -param_enc explícito.
Si bien al menos hay unos pocos bytes diferentes en los resultados anteriores, estoy completamente perdido al permitir que OpenSSL traduzca los datos generados a un formato legible para humanos:
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
Ahora todas las cuerdas de OCTET son exactamente iguales. A mi entender, una de estas debe ser la clave privada, ¿no es así?
Estaría agradecido por cualquier explicación. Tengo antecedentes matemáticos y de programación, y he comprendido los conceptos detrás de la criptografía asimétrica de base RSA. Pero casi no tengo conocimiento acerca de la criptografía de curva elíptica. Solo quiero usarlo para el intercambio de claves ECDHE para fortalecer las consultas HTTPS con perfecto secreto hacia adelante.
Muchas gracias de antemano ...