tinyec
v0.4.0
Una pequeña biblioteca para realizar operaciones aritméticas en curvas elípticas en Python puro. Sin dependencias.
Esta no es una biblioteca adecuada para producción. Es útil para que los profesionales de la seguridad comprendan el funcionamiento interno de EC y puedan jugar con curvas predefinidas.
pip install tinyec
Hay 2 clases principales:
Advertencia Se permiten cálculos en puntos fuera de la curva. Sólo levantarán una advertencia.
Ejemplo de uso en las muestras de rutina del NIST => https://www.nsa.gov/ia/_files/nist-routines.pdf:
>> > import tinyec . ec as ec
>> > import tinyec . registry as reg
>> > c = reg . get_curve ( "secp192r1" )
>> > s = ec . Point ( c , 0xd458e7d127ae671b0c330266d246769353a012073e97acf8 , 0x325930500d851f336bddc050cf7fb11b5673a1645086df3b )
>> > t = ec . Point ( c , 0xf22c4395213e9ebe67ddecdd87fdbd01be16fb059b9753a4 , 0x264424096af2b3597796db48f8dfb41fa9cecc97691a9c79 )
>> > r = s + t
>> > r
( 1787070900316344022479363585363935252075532448940096815760 , 1583034776780933252095415958625802984888372377603917916747 ) on secp192r1 = > y ^ 2 = x ^ 3 + 6277101735386680763835789423207666416083908700390324961276 x + 2455155546008943817740293915197451784769108058161191238065
( mod 6277101735386680763835789423207666416083908700390324961279 )
>> > hex ( r . x )
'0x48e1e4096b9b8e5ca9d0f1f077b8abf58e843894de4d0290L'
>> > hex ( r . y )
'0x408fa77c797cd7dbfb16aa48a3648d3d63c94117d7b6aa4bL'
>> > r = s - t
>> > r
( 6193438478050209507979672067809269724375390027440522152494 , 226636415264149817017346905052752138772359775362461041003 ) on secp192r1 = > y ^ 2 = x ^ 3 + 6277101735386680763835789423207666416083908700390324961276 x + 2455155546008943817740293915197451784769108058161191238065 (
mod 6277101735386680763835789423207666416083908700390324961279 )
>> > hex ( r . x )
'0xfc9683cc5abfb4fe0cc8cc3bc9f61eabc4688f11e9f64a2eL'
>> > hex ( r . y )
'0x93e31d00fb78269732b1bd2a73c23cdd31745d0523d816bL'
>> > r = 2 * s
>> > r
( 1195895923065450997501505402941681398272052708885411031394 , 340030206158745947396451508065335698335058477174385838543 ) on secp192r1 = > y ^ 2 = x ^ 3 + 6277101735386680763835789423207666416083908700390324961276 x + 2455155546008943817740293915197451784769108058161191238065 (
mod 6277101735386680763835789423207666416083908700390324961279 )
>> > hex ( r . x )
'0x30c5bc6b8c7da25354b373dc14dd8a0eba42d25a3f6e6962L'
>> > hex ( r . y )
'0xdde14bc4249a721c407aedbf011e2ddbbcb2968c9d889cfL'
>> > d = 0xa78a236d60baec0c5dd41b33a542463a8255391af64c74ee
>> > r = d * s
>> > hex ( r . x )
'0x1faee4205a4f669d2d0a8f25e3bcec9a62a6952965bf6d31L'
>> > hex ( r . y )
'0x5ff2cdfa508a2581892367087c696f179e7a4d7e8260fb06L'
>> > e = 0xc4be3d53ec3089e71e4de8ceab7cce889bc393cd85b972bc
>> > r = d * s + e * t
>> > r
( 39786866609245082371772779541859439402855864496422607838 , 547967566579883709478937502153554894699060378424501614148 ) on secp192r1 = > y ^ 2 = x ^ 3 + 6277101735386680763835789423207666416083908700390324961276 x + 2455155546008943817740293915197451784769108058161191238065 ( mo
d 6277101735386680763835789423207666416083908700390324961279 )
>> > hex ( r . x )
'0x19f64eed8fa9b72b7dfea82c17c9bfa60ecb9e1778b5bdeL'
>> > hex ( r . y )
'0x16590c5fcd8655fa4ced33fb800e2a7e3c61f35d83503644L'
Si es necesario, también puedes trabajar en tus propias curvas. Aquí tomamos un campo primo 97, con un punto generador (1, 2), un orden 5 y un cofactor de 1:
>> > import tinyec . ec as ec
>> > field = ec . SubGroup ( 97 , ( 1 , 2 ), 5 , 1 )
>> > curve = ec . Curve ( 2 , 3 , field )
tinyec / ec . py : 115 : UserWarning : Point ( 1 , 2 ) is not on curve "undefined" = > y ^ 2 = x ^ 3 + 2 x + 3 ( mod 97 )
warnings . warn ( "Point (%d, %d) is not on curve %s" % ( self . x , self . y , self . curve ))
>> > # Warning is generated because the generator point does not belong to the curve
>> > p1 = ec . Point ( curve , - 5 , 3 )
>> > p1 . on_curve
False
>> > p2 = ec . Point ( curve , 22 , 5 )
>> > p2 . on_curve
True
>> > print ( p1 + p2 )
( 18 , 42 ) off "undefined" = > y ^ 2 = x ^ 3 + 2 x + 3 ( mod 97 )