
firma/verifica ECDSA in pure-python e accordo di chiave ECDH
Questa è un'implementazione facile da usare di ECC (Elliptic Curve Cryptography) con supporto per ECDSA (Elliptic Curve Digital Signature Algorithm), EdDSA (Edwards-curve Digital Signature Algorithm) ed ECDH (Elliptic Curve Diffie-Hellman), implementata interamente in Python, rilasciata sotto la licenza MIT. Con questa libreria puoi creare rapidamente coppie di chiavi (chiave di firma e chiave di verifica), firmare messaggi e verificare le firme. Puoi anche concordare una chiave segreta condivisa basata su chiavi pubbliche scambiate. Le chiavi e le firme sono molto brevi, il che le rende facili da gestire e integrare in altri protocolli.
NOTA: questa libreria non dovrebbe essere usata in contesti di produzione; vedere Sicurezza per maggiori dettagli.
Questa libreria fornisce generazione di chiavi, firma, verifica e derivazione di segreti
condivisi per cinque
curve NIST "Suite B" GF(p) (campo primo) molto diffuse, con lunghezze di chiave di 192,
224, 256, 384 e 521 bit. I "nomi brevi" di queste curve, come noti allo
strumento OpenSSL (openssl ecparam -list_curves), sono: prime192v1,
secp224r1, prime256v1, secp384r1 e secp521r1. Include la curva
a 256 bit secp256k1 usata da Bitcoin. C'è anche il supporto per le
varianti regolari (non twistate) delle curve Brainpool da 160 a 512 bit. I
"nomi brevi" di queste curve sono: brainpoolP160r1, brainpoolP192r1,
brainpoolP224r1, brainpoolP256r1, brainpoolP320r1, brainpoolP384r1,
brainpoolP512r1. Sono incluse anche alcune curve piccole dello standard SEC
(principalmente per velocizzare i test della libreria), e cioè:
secp112r1, secp112r2, secp128r1 e secp160r1.
La generazione delle chiavi, la firma e la verifica sono supportate anche per le curve
Ed25519 e Ed448.
Non sono incluse altre curve, ma non è troppo difficile aggiungere il supporto per ulteriori
curve su campi primi.
Questa libreria usa solo Python e il pacchetto 'six'. È compatibile con Python 2.6, 2.7 e 3.6+. Supporta inoltre l'esecuzione su implementazioni alternative come pypy e pypy3.
Se gmpy2 o gmpy è installato, verranno usati per un'aritmetica più veloce.
Uno dei due può essere installato dopo l'installazione di questa libreria,
python-ecdsa ne rileverà la presenza all'avvio e li userà
automaticamente.
Su Python3 è preferibile usare gmpy2 per prestazioni ottimali.
Per eseguire i test di compatibilità con OpenSSL, lo strumento 'openssl' deve trovarsi nel tuo
PATH. Questa versione è stata testata con successo con OpenSSL 0.9.8o,
1.0.0a, 1.0.2f, 1.1.1d e 3.0.1 (tra gli altri).
Questa libreria è disponibile su PyPI; si consiglia di installarla usando pip:```
pip install ecdsa
Nel caso si desideri una maggiore performance e l'uso di codice nativo non sia un problema, è possibile specificare l'installazione insieme a `gmpy2`:```
pip install ecdsa[gmpy2]
oppure (opzione più lenta, legacy):``` pip install ecdsa[gmpy]
## Velocità
La tabella seguente mostra quanto tempo impiega questa libreria a generare coppie di chiavi
(`keygen`), a firmare dati (`sign`), a verificare tali firme (`verify`),
a derivare un segreto condiviso (`ecdh`), e
a verificare le firme senza precalcolo specifico della chiave (`no PC verify`).
Tutti questi valori sono in secondi.
Per comodità, vengono forniti anche gli inversi di tali valori:
quante chiavi al secondo possono essere generate (`keygen/s`), quante firme
possono essere create al secondo (`sign/s`), quante firme possono essere verificate
al secondo (`verify/s`), quanti segreti condivisi possono essere derivati al secondo
(`ecdh/s`), e quante firme senza precalcolo specifico della chiave
possono essere verificate al secondo (`no PC verify/s`). La dimensione della firma
grezza (generalmente il modo più piccolo
in cui una firma può essere codificata) è fornita anche nella colonna `siglen`.
Usa `tox -e speed` per generare questa tabella sul tuo computer.
Su un Intel Core i7 4790K @ 4.0GHz ottengo le seguenti prestazioni:```
siglen keygen keygen/s sign sign/s verify verify/s no PC verify no PC verify/s
NIST192p: 48 0.00032s 3134.06 0.00033s 2985.53 0.00063s 1598.36 0.00129s 774.43
NIST224p: 56 0.00040s 2469.24 0.00042s 2367.88 0.00081s 1233.41 0.00170s 586.66
NIST256p: 64 0.00051s 1952.73 0.00054s 1867.80 0.00098s 1021.86 0.00212s 471.27
NIST384p: 96 0.00107s 935.92 0.00111s 904.23 0.00203s 491.77 0.00446s 224.00
NIST521p: 132 0.00210s 475.52 0.00215s 464.16 0.00398s 251.28 0.00874s 114.39
SECP256k1: 64 0.00052s 1921.54 0.00054s 1847.49 0.00105s 948.68 0.00210s 477.01
BRAINPOOLP160r1: 40 0.00025s 4003.88 0.00026s 3845.12 0.00053s 1893.93 0.00105s 949.92
BRAINPOOLP192r1: 48 0.00033s 3043.97 0.00034s 2975.98 0.00063s 1581.50 0.00135s 742.29
BRAINPOOLP224r1: 56 0.00041s 2436.44 0.00043s 2315.51 0.00078s 1278.49 0.00180s 556.16
BRAINPOOLP256r1: 64 0.00053s 1892.49 0.00054s 1846.24 0.00114s 875.64 0.00229s 437.25
BRAINPOOLP320r1: 80 0.00073s 1361.26 0.00076s 1309.25 0.00143s 699.29 0.00322s 310.49
BRAINPOOLP384r1: 96 0.00107s 931.29 0.00111s 901.80 0.00230s 434.19 0.00476s 210.20
BRAINPOOLP512r1: 128 0.00207s 483.41 0.00212s 471.42 0.00425s 235.43 0.00912s 109.61
SECP112r1: 28 0.00015s 6672.53 0.00016s 6440.34 0.00031s 3265.41 0.00056s 1774.20
SECP112r2: 28 0.00015s 6697.11 0.00015s 6479.98 0.00028s 3524.72 0.00058s 1716.16
SECP128r1: 32 0.00018s 5497.65 0.00019s 5272.89 0.00036s 2747.39 0.00072s 1396.16
SECP160r1: 42 0.00025s 3949.32 0.00026s 3894.45 0.00046s 2153.85 0.00102s 985.07
Ed25519: 64 0.00076s 1324.48 0.00042s 2405.01 0.00109s 918.05 0.00344s 290.50
Ed448: 114 0.00176s 569.53 0.00115s 870.94 0.00282s 355.04 0.01024s 97.69