
Implementazioni Python di attacchi crittografici e utilità.
Implementazioni Python di attacchi crittografici e utility.
Puoi verificare la versione di Python del tuo SageMath usando il seguente comando:``` $ sage -python --version Python 3.9.0
Se la versione del tuo Python SageMath è precedente alla 3.9.0, alcune funzionalità in alcuni script potrebbero non funzionare.
## Utilizzo
I test unitari si trovano nella directory `test` e possono essere eseguiti tramite il modulo `unittest` o usando `pytest`. Non dovrebbe richiedere molto tempo, forse qualche minuto a seconda della macchina.
Per eseguire un attacco specifico, devi aggiungere il codice al file appropriato prima di eseguirlo.
### Esempio
Ad esempio, vuoi attaccare RSA usando l'attacco Boneh-Durfee, con i seguenti parametri (tratti da [test_rsa.py](https://github.com/jvdsn/crypto-attacks/blob/master/test/test_rsa.py)):```python
N = 88320836926176610260238895174120738360949322009576866758081671082752401596826820274141832913391890604999466444724537056453777218596634375604879123818123658076245218807184443147162102569631427096787406420042132112746340310992380094474893565028303466135529032341382899333117011402408049370805729286122880037249
e = 36224751658507610673165956970793195381480143363550601971796688201449789736497322700382657163240771111376677180786660893671085854060092736865293791299460933460067267613023891500397200389824179925263846148644777638774319680682025117466596019474987378275216579013846855328009375540444176771945272078755317168511
Aggiungi il seguente codice in fondo al file boneh_durfee.py:```python import logging
logging.basicConfig(level=logging.DEBUG)
N = 88320836926176610260238895174120738360949322009576866758081671082752401596826820274141832913391890604999466444724537056453777218596634375604879123818123658076245218807184443147162102569631427096787406420042132112746340310992380094474893565028303466135529032341382899333117011402408049370805729286122880037249 e = 36224751658507610673165956970793195381480143363550601971796688201449789736497322700382657163240771111376677180786660893671085854060092736865293791299460933460067267613023891500397200389824179925263846148644777638774319680682025117466596019474987378275216579013846855328009375540444176771945272078755317168511 p_bits = 512 delta = 0.26
p, q = attack(N, e, p_bits, delta=delta, m=3) assert p * q == N print(f"Found {p = } and {q = }")
Poi puoi semplicemente eseguire il file usando Sage. Non importa da dove lo esegui, il percorso Python viene impostato automaticamente (puoi anche richiamare gli attacchi da altri file Python, ma in tal caso dovrai sistemare il percorso Python da solo):```commandline
[crypto-attacks]$ sage -python attacks/rsa/boneh_durfee.py
INFO:root:Trying m = 3, t = 1...
DEBUG:root:Generating shifts...
DEBUG:root:Creating a lattice with 11 shifts (order = 'invlex', sort_shifts_reverse = False, sort_monomials_reverse = False)...
DEBUG:root:Reducing a 11 x 11 lattice...
DEBUG:root:Reconstructing polynomials (divide_original = True, modulus_bound = False, divide_gcd = True)...
DEBUG:root:Polynomial at row 8 is constant, ignoring...
DEBUG:root:Reconstructed polynomial has gcd 1312232632720549890113031660369306919929075823824696839212183146130434668203517349691252841557097914064120078389640402109017308806168467714230057403815071456395553717020189622129706447677967264344568789118172311850383406340547579993263937406518074980025897726255316031512238322022839331135299265704052474541497687419350763703993630899191179705015113329644753599872380152055902238937889027950089072598069861391599563222633064848996619752054685734260976071760984100109990150069201501748622288840900421607423175114026653242500476408861976142751384898489130281755466581359057847077651502734556259387442296763474369957121 with polynomial at 8, dividing...
DEBUG:root:Reconstructed 10 polynomials
DEBUG:root:Computing pairwise gcds to find trivial roots...
DEBUG:root:Using Groebner basis method to find roots...
DEBUG:root:Sequence length: 10, Groebner basis length: 1
DEBUG:root:Sequence length: 9, Groebner basis length: 1
DEBUG:root:Sequence length: 8, Groebner basis length: 1
DEBUG:root:Sequence length: 7, Groebner basis length: 2
DEBUG:root:Found Groebner basis with length 2, trying to find roots...
Found p = 7866790440964395011005623971351568677139336343167390105188826934257986271072664643571727955882500173182140478082778193338086048035817634545367411924942763 and q = 11227048386374621771175649743442169526805922745751610531569607663416378302561807690656370394330458335919244239976798600743588701676542461805061598571009923
I parametri m e t mostrati nel log di output meritano particolare attenzione. Questi parametri sono usati in molti algoritmi reticolari (piccole radici) per regolare la dimensione del reticolo. Concettualmente, m (a volte chiamato k) e t rappresentano il numero di "shifts" usati nel reticolo, che è approssimativamente uguale o proporzionale al numero di righe. Pertanto, aumentare m e t aumenterà la dimensione del reticolo, il che aumenta anche il tempo necessario per eseguire la riduzione reticolare (attualmente usando LLL). D'altra parte, se m e t sono troppo bassi, è possibile che la riduzione reticolare non produca vettori appropriati, sprecando così il tempo dedicato alla riduzione. Dunque, si tratta di un compromesso.
Nella versione attuale del progetto, m deve essere sempre fornito dall'utente (il valore predefinito è 1). t può, in alcuni casi, essere calcolato in base al metodo specifico per piccole radici usato dall'attacco. Tuttavia può comunque essere modificato dall'utente. In generale, ci sono due modi per usare questi tipi di parametri:
m = 1 fino a quando non viene trovata una risposta (esempio sotto). Questo è un approccio semplice, ma rischia di sprecare tempo in calcoli inutili con reticoli troppo piccoli.```
m = 1
while True:
res = attack(..., m=m)
if res is not None:
# The attack succeeded!
break
m += 1* Implementa una versione di debug dell'attacco che stai cercando di utilizzare (con risultati noti) e determina il valore di `m` che produce buoni vettori del reticolo. Quindi chiama direttamente il metodo dell'attacco con il valore `m` corretto.
## Attacchi implementati
### Divisore comune approssimato
* [x] [Attacco polinomiale multivariato](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/mp.py) [^acd_mp]
* [x] [Attacco basato sul reticolo ortogonale](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/ol.py) [^acd_ol]
* [x] [Attacco basato sull'approssimazione diofantea simultanea](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/sda.py) [^acd_sda]
### CBC
* [x] [Attacco di bit flipping](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/bit_flipping.py)
* [x] [Attacco di recupero dell'IV](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/iv_recovery.py)
* [x] [Attacco tramite oracolo di padding](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/padding_oracle.py)
### CBC + CBC-MAC
* [x] [Attacco di riuso della chiave (encrypt-and-MAC)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/eam_key_reuse.py)
* [x] [Attacco di riuso della chiave (encrypt-then-MAC)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/etm_key_reuse.py)
* [x] [Attacco di riuso della chiave (MAC-then-encrypt)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/mte_key_reuse.py)
### CBC-MAC
* [x] [Attacco di estensione della lunghezza](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_mac/length_extension.py)