目前,我正试图使我的web服务器尽可能安全,我正在服务器端测试不同的密码套件,其中一些使用ECDHE密钥交换。
在生成私有EC密钥时,我注意到大多数生成的数据在生成两个密钥时是相同的。原始产出:
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-----正如您所看到的,大多数私钥是相同的。但是,我对生成私钥的理解一直是,每个私钥都应该是独一无二的。有人能弄清楚这件事吗?
请注意,我在不同版本的OpenSSL中观察到了这一点,其中最近的一个版本(OpenSSL 1.0.2e)。还请注意,如果我让命令行显式地切换-param_enc,结果是相同的。
虽然上面的结果至少有几个字节不同,但当让OpenSSL将生成的数据转换为人类可读的形式时,我完全迷失了方向:
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现在所有的八进制字符串都是完全相同的。据我所知,其中之一应该是私钥,不是吗?
如有任何解释,我将不胜感激。我有数学和编程背景,我了解RSA基础非对称密码背后的概念。但我对椭圆曲线密码学几乎一无所知。我只想使用它来进行ECDHE密钥交换,以便使HTTPS查询具有完善的前向保密功能。
谢谢你提前..。
发布于 2015-12-13 11:51:31
这些钥匙不一样。他们很不一样。它们都以'MI‘开头,但这只是PEM 64编码的一个属性。
另外:我猜您的ASN1PARSE只解析该输出中的第一个PEM对象。这就是你想要的曲线。所以这应该是一样的。解析第二个PEM对象(实际的私钥),您将看到私钥(曲线点)不完全相同。
https://security.stackexchange.com/questions/108008
复制相似问题