獲取橢圓曲線方程的參數
我有一個二進制簽名,
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'
04
表示公鑰的未壓縮形式。上半場是 $ x $ - 座標,後半部分是 $ y $ -公鑰的座標。
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 PUB 186-4或SEC 2:推薦橢圓曲線域參數為六元組中找到
$$ T = (p, a, b, G, n, h) $$
p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFFFF 00000000 00000000 FFFFFFFF
$$ p = 2^{384} − 2^{128} − 2^{96} + 2^{32} − 1 $$
曲線 $ 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 90EA0E5F
$ n $ 是基點的階數 $ 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 命令行橢圓曲線操作也可以列印值
openssl ecparam -name secp384r1 -out secp384r1.pem openssl ecparam -in secp384r1.pem -text -param_enc explicit -noout
壓縮
或
0x02
表示0x03
區別 $ Y $ 或者 $ -Y $ . 由於在橢圓曲線$$ Y^2 = X^3 + aX + b $$如果 $ (X,Y) $ 那麼是一個點 $ (X,-Y) $ 也是曲線上的一個點。這是由於平方 $ Y $ 在橢圓曲線方程中。由最低有效位設計的區別 $ Y $ ,
0x02
為0
,0x03
為1
.