Dapatkan parameter persamaan kurva elips
Saya memiliki biner yang ditandatangani ECDSA384dan saya perlu memverifikasinya menggunakan pustaka kriptografi tertentu.
Hal pertama yang perlu dilakukan adalah menginisialisasi kunci publik EC, yang melibatkan pengaturan beberapa parameter 'secara manual'. Parameter ini adalah parameter yang membuat persamaan EC berikut:
Persamaan Kurva Eliptik selesai $\operatorname{GF}(p): y^2=x^3+ax+b \pmod{p}.$
Saya membutuhkan parameternya $a$, $b$, $p$ dan $n$. (tidak tahu apa$n$ aku s)
Kunci yang saya gunakan ada dalam PEMformat. Saya sadar bahwa parameter EC dapat diekstraksi dengan melakukan:
openssl ec -in ec384.pem -noout -text
dan saya mendapatkan
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
Namun, saya tidak mendapatkan parameter yang saya butuhkan dari keluaran itu. Tidak terlalu jelas bagi saya apakah parameter ini berubah dari kunci ke kunci atau mereka melekat pada kurva yang digunakan, dalam kasus saya P-384,.
Bagaimana saya bisa mendapatkan parameter yang saya butuhkan?
EDIT - mungkin membantu
Terlepas dari jawaban fantastis, saya menemukan ini yang mungkin membantu:
The pythonperpustakaan ecpyberisi informasi ini, misalnya:
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'
Jawaban
04menunjukkan bentuk kunci publik yang tidak dikompresi .
Paruh pertama adalah $x$-koordinasi dan paruh kedua adalah $y$-koordinasi dari kunci publik.
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
Parameter yang Anda cari ditentukan di bagian terakhir.
ASN1 OID: secp384r1
NIST CURVE: P-384
Parameter dapat ditemukan di FIPS PUB 186-4 atau SEC 2: Parameter Domain Kurva Eliptik yang Direkomendasikan sebagai sextuple
$$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$$
Kurva $E: y^2 = x^3 + ax + b$ lebih $F_p$ didefinisikan $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
Titik dasar $G$dalam bentuk terkompresi ( 03) menunjukkan
G = 03 AA87CA22 BE8B0537 8EB1C71E F320AD74 6E1D3B62 8BA79B98
59F741E0 82542A38 5502F25D BF55296C 3A545E38 72760AB7
Titik dasar $G$dalam bentuk terkompresi ( 04) menunjukkan
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$ adalah urutan titik dasar $G$
n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
C7634D81 F4372DDF 581A0DB2 48B0A77A ECEC196A CCC52973
dan kofaktor $h$ aku s:
h = 01
Kofaktor dihitung dengan $$h = \frac{|E(\mathbb{F_p})|}{n}$$
Mencetak melalui OpenSSL
Menggunakan Operasi Kurva Eliptik Baris Perintah OpenSSL, dimungkinkan untuk mencetak nilai juga
openssl ecparam -name secp384r1 -out secp384r1.pem
openssl ecparam -in secp384r1.pem -text -param_enc explicit -noout
Kompresi
The 0x02atau 0x03menunjukkan perbedaan$Y$ atau $-Y$. Sejak di kurva elips$$Y^2 = X^3 + aX + b$$ jika $(X,Y)$ adalah satu poin $(X,-Y)$juga merupakan titik di kurva. Ini karena kuadrat$Y$ dalam persamaan kurva elips.
Perbedaan dirancang oleh sedikit yang paling signifikan $Y$, 0x02untuk 0, dan 0x03untuk 1.
ASN1 OID: secp384r1
NIST CURVE: P-384
Parameter ini disebut parameter bernama dan mereka menentukan parameter yang digunakan sepenuhnya . Mereka tidak berubah per kunci. Kurva Sec 1 awalnya ditentukan, dinamai dan didaftarkan oleh Certicom.
Hilang dari spesifikasi di atas adalah OID:
- Panjang bentuk ASN.1 OID:
{iso(1) identified-organization(3) certicom(132) curve(0) ansip384r1(34)}; - Singkat bentuk dot-notasi:
1.3.132.0.34.
Kemudian mereka telah distandarisasi oleh ANSI X9.62 (payware) dan oleh publikasi khusus NIST 186-4: Digital Signature Standard (DSS) bagian D.1.2.4 . Perhatikan bahwa dokumen terakhir ini mungkin digantikan oleh 186-5 - saat ini dalam draf - tetapi itu tidak akan mengubah nama atau parameter itu sendiri.
Itu $n$adalah urutan kurva. Masih hilang adalah faktor pendamping$h$, tapi itu biasanya ditetapkan ke nilai 1 dan mungkin diabaikan karena alasan tertentu. Benih dapat diabaikan begitu saja: ini menunjukkan secara acak dari mana nilai-nilai itu diturunkan. Kurva lain menggunakan "tidak ada nomor lengan saya" untuk ini atau hindari sama sekali.
Umumnya pustaka berisi parameter ini langsung di sumber atau di dalam sumber daya. Mereka sering berisi tabel di mana Anda bisa mengambil parameter (mungkin dalam format khusus perpustakaan) dengan menyediakan parameter bernama sebagai string atau OID (pengidentifikasi objek).