Come posso ottenere il punto della curva ellittica?

0

Ho stabilito una connessione con facebook.com e ho bisogno del punto che viene utilizzato nella firma. Ho la chiave pubblica e il certificato. Anche con il comando:

openssl ec -pubin -in facebook_pub.key -noout -text -param_enc explicit

Ottengo quell'output:

read EC key
Public-Key: (256 bit)
pub:
    04:a0:f1:8c:af:a7:39:88:68:5b:13:56:0e:15:15:
    b4:a7:45:ef:1b:c7:e5:85:3c:2b:04:d4:65:8a:31:
    31:22:ea:a3:92:ed:64:9d:ba:65:81:e3:b6:12:76:
    d8:b3:0b:45:f1:ff:0a:28:14:9c:4f:dc:73:a9:b3:
    49:2d:a0:76:d3
Field Type: prime-field
Prime:
    00:ff:ff:ff:ff:00:00:00:01:00:00:00:00:00:00:
    00:00:00:00:00:00:ff:ff:ff:ff:ff:ff:ff:ff:ff:
    ff:ff:ff
A:   
    00:ff:ff:ff:ff:00:00:00:01:00:00:00:00:00:00:
    00:00:00:00:00:00:ff:ff:ff:ff:ff:ff:ff:ff:ff:
    ff:ff:fc
B:   
    5a:c6:35:d8:aa:3a:93:e7:b3:eb:bd:55:76:98:86:
    bc:65:1d:06:b0:cc:53:b0:f6:3b:ce:3c:3e:27:d2:
    60:4b
Generator (uncompressed):
    04:6b:17:d1:f2:e1:2c:42:47:f8:bc:e6:e5:63:a4:
    40:f2:77:03:7d:81:2d:eb:33:a0:f4:a1:39:45:d8:
    98:c2:96:4f:e3:42:e2:fe:1a:7f:9b:8e:e7:eb:4a:
    7c:0f:9e:16:2b:ce:33:57:6b:31:5e:ce:cb:b6:40:
    68:37:bf:51:f5
Order: 
    00:ff:ff:ff:ff:00:00:00:00:ff:ff:ff:ff:ff:ff:
    ff:ff:bc:e6:fa:ad:a7:17:9e:84:f3:b9:ca:c2:fc:
    63:25:51
Cofactor:  1 (0x1)
Seed:
    c4:9d:36:08:86:e7:04:93:6a:66:78:e1:13:9d:26:
    b7:81:9f:7e:90

Con questa uscita posso vedere il primo, A, B e il generatore. Ma posso vedere Px e Py. Qualcuno sa come trovarlo?

    
posta Roger Coll Aumatell 05.01.2018 - 12:58
fonte

1 risposta

1

Ecco un modo terribilmente inelegante di ottenere le coordinate.

Secondo la RFC 5480 sezione 2.2 la definizione di ECPoint è all'interno di SEC1 (sezione 2.3.4) .

E l'essenza di quella sezione è semplicemente:

  • rimuovi 0x04 tag byte
  • prendi i restanti byte e
    • imposta metà sinistra come X
    • e la metà destra di Y.

L'ho seguito di seguito con il fastecdsa modulo Python.

Copia il componente X

Ignora il primo byte. (Solo un valore di tag.)

$ openssl ec -pubin -in facebook_pub.key -noout -text -conv_form compressed 2>/dev/null | grep '^    ' | sed 's/://g' | xargs echo | sed 's/ //g'
03a0f18cafa73988685b13560e1515b4a745ef1bc7e5853c2b04d4658a313122ea

Componente Grab Y

("Y" deve essere il resto della stringa dopo il componente "X" I. e. dopo la parte "22ea".)

$ openssl ec -pubin -in facebook_pub.key -noout -text 2>/dev/null | grep '^    ' | sed 's/://g' | xargs echo | sed 's/ //g'

04a0f18cafa73988685b13560e1515b4a745ef1bc7e5853c2b04d4658a313122eaa392ed649dba6581e3b61276d8b30b45f1ff0a28149c4fdc73a9b3492da076d3

Installa il pacchetto python "fastecdsa"

$ time pip install fastecdsa
Collecting fastecdsa
  Downloading fastecdsa-1.6.1.tar.gz
Building wheels for collected packages: fastecdsa
  Running setup.py bdist_wheel for fastecdsa ... done
  Stored in directory: /home/User/.cache/pip/wheels/93/8a/d3/be7fc222c030383ac6313be85c602762daafc2cac8fd547e44
Successfully built fastecdsa
Installing collected packages: fastecdsa
Successfully installed fastecdsa-1.6.1

real    0m19.002s
user    0m4.909s
sys     0m4.102s

Usa all'interno di ipython

$ ipython

In [1]: from fastecdsa.point import Point

In [2]: from fastecdsa.point import P256

In [3]: x=0xa0f18cafa73988685b13560e1515b4a745ef1bc7e5853c2b04d4658a313122ea

In [4]: y=0xa392ed649dba6581e3b61276d8b30b45f1ff0a28149c4fdc73a9b3492da076d3

In [5]: Point(1,2, curve=P256)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-18-fb7bd27a246d> in <module>()
----> 1 Point(1,2, curve=P256)

/usr/lib/python2.7/site-packages/fastecdsa/point.pyc in __init__(self, x, y, curve)
     12     def __init__(self, x, y, curve=P256):
     13         if not curve.is_point_on_curve((x, y)):
---> 14             raise ValueError('(x, y) coordinates are not on curve <{}>'.format(curve.name))
     15         else:
     16             self.x = x

ValueError: (x, y) coordinates are not on curve <P256>

In [6]: p=Point(x, y, curve=P256)

In [7]: p.x
Out[7]: 72796836896024250540670287871159592541946330786250779466423542213376197337834L

In [8]: p.y
Out[8]: 73986592417019630365603572314878953642162012803095695018690968405918923912915L

In [9]: p.curve
Out[9]: <fastecdsa.curve.Curve instance at 0x6fffeb1b5a8>

Come puoi vedere sopra: fastecdsa genererà un errore se fornisci argomenti non validi (come "1, 2, curva = P256") al costruttore "Punto (...)".

    
risposta data 06.01.2018 - 00:42
fonte

Leggi altre domande sui tag