Elliptic-Curves

獲取橢圓曲線方程的參數

  • December 13, 2021

我有一個二進制簽名,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.

我怎樣才能得到我需要的參數?

編輯 - 可能會有所幫助

除了出色的答案之外,我發現這可能會有所幫助:

pythonecpy包含此資訊,例如:

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-4SEC 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 $ ,0x020,0x031.

引用自:https://crypto.stackexchange.com/questions/83465