我有一个用ECDSA384签名的二进制文件,我需要使用一个特定的密码库来验证它。
需要做的第一件事是初始化EC公钥,这涉及到“手动”设置几个参数。这些参数构成了以下EC方程:
\operatorname{GF}(p): y^2=x^3+ax+b \pmod{p}.上的椭圆曲线方程
我需要参数a,b,p和n。(不知道n是什么)
我使用的密钥是PEM格式的。我知道可以通过以下操作提取EC参数:
openssl ec -in ec384.pem -noout -text我得到了
read EC key
Private-Key: (384 bit)
priv:
5d:b1:ef:88:fe:7b:f2:af:d8:cc:3a:04:89:09:34:
15:c4:17:7b:41:72:ee:32:7b:54:9a:e2:aa:fa:1d:
d1:47:1a:ef:fe:dc:d3:6b:51:fa:bd:c2:5e:66:c4:
42:d0:16
pub:
04:5e:ff:47:19:80:be:93:5f:8f:51:14:45:d5:40:
41:79:ca:48:be:85:97:bd:e2:0f:2b:a0:b2:7d:6c:
37:74:39:44:ff:50:67:74:30:a8:10:ac:89:a6:6a:
80:5a:1a:c9:82:ff:2a:51:84:38:c8:f6:af:e0:46:
e7:9f:d5:66:1b:20:75:7f:87:42:46:d9:6e:12:4f:
74:38:4d:f4:9f:b1:13:27:9a:10:a8:0c:6b:4b:1f:
f6:6c:bf:32:ee:a3:10
ASN1 OID: secp384r1
NIST CURVE: P-384尽管如此,我仍然不能从输出中得到我需要的参数。我不太清楚这些参数是从键更改到键,还是它们是所使用的曲线所固有的,在我的例子中是P-384。
我怎样才能得到我需要的参数?
除了这些奇妙的答案之外,我还发现这可能会有所帮助:
python库ecpy包含以下信息:
pip3 install ecpy
python3
>>> import ecpy.curves as ec
>>> ec.Curve.get_curve_names()
['stark256', 'frp256v1', 'secp521r1', 'secp384r1', ...]
>>> p384 = ec.Curve.get_curve('secp384r1')
>>> hex(p384.a)
'0xffff...ffc'
>>> hex(p384.b)
'0xb3312f...3ec2aef'
>>> hex(p384.order)
'0xfffffff...cc52973'
>>> hex(p384.field) # This is the modulus
'0xfffffff...00ffffffff'发布于 2020-08-21 13:10:41
04表示公钥的未压缩形式。
前半部分是x-coordinate,下半部分是公钥的y-coordinate。
x= 5e:ff:47:19:80:be:93:5f:8f:51:14:45:d5:
40:41:79:ca:48:be:85:97:bd:e2:0f:2b:a0:
b2:7d:6c:37:74:39:44:ff:50:67:74:30:a8:
10:ac:89:a6:6a:80:5a:1a:c9:
y =82:ff:2a:51:84:38:c8:f6:af:e0:46:e7:9f:
d5:66:1b:20:75:7f:87:42:46:d9:6e:12:4f:
74:38:4d:f4:9f:b1:13:27:9a:10:a8:0c:6b:
4b:1f:f6:6c:bf:32:ee:a3:10您要查找的参数在最后一部分中定义。
ASN1 OID: secp384r1
NIST CURVE: P-384这些参数可以在FIPS酒吧186-4或第2节:推荐的椭圆曲线域参数中作为六元组找到。
p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFE FFFFFFFF 00000000 00000000 FFFFFFFF定义了E: y^2 = x^3 + ax + b在F_p上的曲线b;
a = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFE FFFFFFFF 00000000 00000000 FFFFFFFC
b = B3312FA7 E23EE7E4 988E056B E3F82D19 181D9C6E FE814112
0314088F 5013875A C656398D 8A2ED19D 2A85C8ED D3EC2AEF压缩形式的基点G (03)表示
G = 03 AA87CA22 BE8B0537 8EB1C71E F320AD74 6E1D3B62 8BA79B98
59F741E0 82542A38 5502F25D BF55296C 3A545E38 72760AB7基准点G以未压缩形式(04)指示
G = 04 AA87CA22 BE8B0537 8EB1C71E F320AD74 6E1D3B62 8BA79B98
59F741E0 82542A38 5502F25D BF55296C 3A545E38 72760AB7
3617DE4A 96262C6F 5D9E98BF 9292DC29 F8F41DBD 289A147C
E9DA3113 B5F0B8C0 0A60B1CE 1D7E819D 7A431D7C 90EA0E5Fn是基点G的顺序
n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
C7634D81 F4372DDF 581A0DB2 48B0A77A ECEC196A CCC52973辅助性因子h是:
h = 01辅助性因子由h = \frac{|E(\mathbb{F_p})|}{n}分解而成
打印
使用OpenSSL命令-线椭圆曲线操作也可以打印这些值。
openssl ecparam -name secp384r1 -out secp384r1.pem
openssl ecparam -in secp384r1.pem -text -param_enc explicit -noout0x02或0x03表示Y或-Y的区别。因为在椭圆曲线中,Y^2 = X^3 + aX + b,如果(X,Y)是点,那么(X,-Y)也是曲线上的一个点。这是由于椭圆曲线方程中Y的平方所致。
最不重要的Y、0x02用于0和0x03用于1设计的区别。
发布于 2020-08-21 13:24:33
ASN1 OID: secp384r1 NIST曲线: P-384
这些参数被称为命名参数,它们完全指定使用的参数。他们不会改变每把钥匙。Sec 1曲线最初是Certicom的指明、指名和注册曲线。
上述规范中缺少的是OID:
{iso(1) identified-organization(3) certicom(132) curve(0) ansip384r1(34)};1.3.132.0.34.然后由ANSX9.62 (payware)和NIST特别出版物186-4:数字签名标准(DSS)节D.1.2.4对它们进行标准化。请注意,后一种文档可能会被186种替代--目前正在起草中--但这不会改变名称或参数本身。
n是曲线的阶数。仍然缺少的是辅助因子h,但是它通常被设置为1,并且可能因为这个特殊原因而被忽略。可以简单地忽略该种子:它显示了从其中导出值的随机值。其他曲线则使用“不加袖子号码”,或者完全避免使用。
通常,库直接在源或资源中包含这些参数。它们通常包含表,您可以通过将命名参数作为字符串或OID (对象标识符)来检索参数(可能是库特定的格式)。
https://crypto.stackexchange.com/questions/83465
复制相似问题