tinyec
v0.4.0
Eine kleine Bibliothek zum Ausführen arithmetischer Operationen an elliptischen Kurven in reinem Python. Keine Abhängigkeiten.
Dies ist keine für die Produktion geeignete Bibliothek. Für Sicherheitsexperten ist es nützlich, das Innenleben von EC zu verstehen und mit vordefinierten Kurven spielen zu können.
pip install tinyec
Es gibt 2 Hauptklassen:
Warnung Berechnungen an Punkten außerhalb der Kurve sind zulässig. Sie werden nur eine Warnung aussprechen.
Beispielanwendung für die NIST-Routinenbeispiele => 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'
Bei Bedarf können Sie auch Ihre eigenen Kurven bearbeiten. Hier nehmen wir ein Primzahlfeld 97 mit einem Generatorpunkt (1, 2), einer Ordnung 5 und einem Cofaktor von 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 )