Ottieni i parametri dell'equazione di una curva ellittica
Ho un binario firmato con ECDSA384
e devo verificarlo utilizzando una particolare libreria di crittografia.
La prima cosa da fare è inizializzare la chiave pubblica EC, il che comporta l'impostazione "manuale" di diversi parametri. Questi parametri sono quelli che compongono la seguente equazione EC:
Finita l'equazione della curva ellittica$\operatorname{GF}(p): y^2=x^3+ax+b \pmod{p}.$
mi servono i parametri$a$,$b$,$p$e$n$. (non ho idea di cosa$n$è)
La chiave che sto usando è in PEM
format. Sono consapevole che i parametri EC possono essere estratti facendo:
openssl ec -in ec384.pem -noout -text
e ottengo
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
Tuttavia, non ottengo i parametri di cui ho bisogno da quell'output. Non mi è molto chiaro se questi parametri cambino da tasto a tasto o siano inerenti alla curva utilizzata, nel mio caso, P-384
.
Come posso ottenere i parametri di cui ho bisogno?
EDIT - potrebbe aiutare
Oltre alle fantastiche risposte, ho trovato questo che potrebbe aiutare:
La python
libreria ecpy
contiene queste informazioni, ad esempio:
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'
Risposte
04
indica la forma non compressa della chiave pubblica.
La prima metà è la$x$-coordinate e la seconda metà è il$y$-coordinate della chiave pubblica.
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
I parametri che stai cercando sono definiti nell'ultima parte.
ASN1 OID: secp384r1
NIST CURVE: P-384
I parametri possono essere trovati in FIPS PUB 186-4 o SEC 2: Parametri del dominio della curva ellittica consigliati come sestuplo
$$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$$
La curva$E: y^2 = x^3 + ax + b$Sopra$F_p$è definito$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
Il punto base$G$in forma compressa ( 03
) indica
G = 03 AA87CA22 BE8B0537 8EB1C71E F320AD74 6E1D3B62 8BA79B98
59F741E0 82542A38 5502F25D BF55296C 3A545E38 72760AB7
Il punto base$G$in forma non compressa ( 04
) indica
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$è l'ordine del punto base$G$
n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
C7634D81 F4372DDF 581A0DB2 48B0A77A ECEC196A CCC52973
e il cofattore$h$è:
h = 01
Il cofattore è calcolato da$$h = \frac{|E(\mathbb{F_p})|}{n}$$
Stampa tramite OpenSSL
Utilizzando OpenSSL Command-Line Elliptic Curve Operations è anche possibile stampare i valori
openssl ecparam -name secp384r1 -out secp384r1.pem
openssl ecparam -in secp384r1.pem -text -param_enc explicit -noout
La compressione
Il 0x02
o 0x03
indica la distinzione di$Y$o$-Y$. Poiché nella curva ellittica$$Y^2 = X^3 + aX + b$$Se$(X,Y)$è un punto allora$(X,-Y)$è anche un punto sulla curva. Ciò è dovuto al quadrato di$Y$nell'equazione della curva ellittica.
La distinzione disegnata dalla parte meno significativa di$Y$, 0x02
per 0
e 0x03
per 1
.
ASN1 OID: secp384r1
CURVA NIST: P-384
Questi parametri sono i cosiddetti parametri con nome e specificano completamente i parametri utilizzati . Non cambiano per chiave. Le curve Sec 1 sono state inizialmente specificate, denominate e registrate da Certicom.
Manca dalla specifica sopra è l'OID:
- Forma lunga ASN.1 OID:
{iso(1) identified-organization(3) certicom(132) curve(0) ansip384r1(34)}
; - Notazione punto in forma abbreviata:
1.3.132.0.34
.
Successivamente sono stati standardizzati da ANSI X9.62 (payware) e dalla pubblicazione speciale NIST 186-4: Digital Signature Standard (DSS) section D.1.2.4 . Si noti che quest'ultimo documento potrebbe essere sostituito dal 186-5 - attualmente in bozza - ma ciò non cambierà il nome oi parametri stessi.
Il$n$è l'ordine della curva. Manca ancora il cofattore$h$, ma in genere è impostato sul valore 1 e potrebbe essere omesso per quel particolare motivo. Il seme può essere semplicemente ignorato: mostra un casuale da cui sono stati derivati i valori. Altre curve usano un "numero di niente nella manica" per questo o lo evitano del tutto.
Generalmente le librerie contengono questi parametri direttamente nel sorgente o all'interno di una risorsa. Spesso contengono tabelle in cui è possibile recuperare i parametri (possibilmente in un formato specifico della libreria) fornendo il parametro denominato come una stringa o un OID (identificatore di oggetto).