
Implementaciones en Python de ataques y utilidades criptográficas.
Implementaciones en Python de ataques y utilidades criptográficas.
Puedes comprobar la versión de Python de SageMath con el siguiente comando:``` $ sage -python --version Python 3.9.0
Si la versión de Python de SageMath es anterior a la 3.9.0, algunas funcionalidades de algunos scripts podrían no funcionar.
## Uso
Las pruebas unitarias se encuentran en el directorio `test` y se pueden ejecutar con el módulo `unittest` o con `pytest`. Esto no debería llevar mucho tiempo, quizás unos minutos dependiendo de tu máquina.
Para ejecutar un ataque específico, debes añadir el código al archivo adecuado antes de ejecutarlo.
### Ejemplo
Por ejemplo, quieres atacar RSA usando el ataque Boneh-Durfee, con los siguientes parámetros (tomados de [test_rsa.py](https://github.com/jvdsn/crypto-attacks/blob/master/test/test_rsa.py)):```python
N = 88320836926176610260238895174120738360949322009576866758081671082752401596826820274141832913391890604999466444724537056453777218596634375604879123818123658076245218807184443147162102569631427096787406420042132112746340310992380094474893565028303466135529032341382899333117011402408049370805729286122880037249
e = 36224751658507610673165956970793195381480143363550601971796688201449789736497322700382657163240771111376677180786660893671085854060092736865293791299460933460067267613023891500397200389824179925263846148644777638774319680682025117466596019474987378275216579013846855328009375540444176771945272078755317168511
Añade el siguiente código al final del archivo 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 = }")
Entonces puedes simplemente ejecutar el archivo usando Sage. No importa desde dónde lo ejecutes, la ruta de Python se establece automágicamente (también puedes llamar a los ataques desde otros archivos de Python, pero entonces tendrás que arreglar la ruta de Python tú mismo):```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
Los parámetros m y t que se muestran en el registro de salida merecen especial atención. Estos parámetros se utilizan en muchos algoritmos basados en retículos (raíces pequeñas) para ajustar el tamaño del retículo. Conceptualmente, m (a veces llamado k) y t representan el número de "desplazamientos" utilizados en el retículo, que es aproximadamente igual o proporcional al número de filas. Por lo tanto, aumentar m y t aumentará el tamaño del retículo, lo que también aumenta el tiempo necesario para realizar la reducción del retículo (actualmente usando LLL). Por otro lado, si m y t son demasiado bajos, es posible que la reducción del retículo no produzca los vectores adecuados, desperdiciando así el tiempo invertido en la reducción. Por lo tanto, hay un equilibrio.
En la versión actual del proyecto, m siempre debe ser proporcionado por el usuario (el valor predeterminado es 1). t puede, en algunos casos, calcularse según el método específico de raíces pequeñas utilizado por el ataque. Sin embargo, el usuario aún puede ajustarlo. En general, hay dos formas de usar este tipo de parámetros:
m = 1 hasta que se encuentre una respuesta (ejemplo a continuación). Este es un enfoque simple, pero corre el riesgo de perder tiempo en cálculos inútiles con retículos demasiado pequeños.```
m = 1
while True:
res = attack(..., m=m)
if res is not None:
# The attack succeeded!
break
m += 1* Implementa una versión de depuración del ataque que intentas usar (con resultados conocidos) y determina el valor de `m` que produce buenos vectores de retículo. Luego llama directamente al método de ataque con el valor de `m` correcto.
## Ataques implementados
### Divisor Común Aproximado
* [x] [Ataque polinómico multivariado](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/mp.py) [^acd_mp]
* [x] [Ataque basado en ortogonalidad](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/ol.py) [^acd_ol]
* [x] [Ataque de aproximación diofántica simultánea](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/sda.py) [^acd_sda]
### CBC
* [x] [Ataque de volteo de bits](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/bit_flipping.py)
* [x] [Ataque de recuperación del IV](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/iv_recovery.py)
* [x] [Ataque de oráculo de relleno](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/padding_oracle.py)
### CBC + CBC-MAC
* [x] [Ataque de reutilización de clave (encrypt-and-MAC)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/eam_key_reuse.py)
* [x] [Ataque de reutilización de clave (encrypt-then-MAC)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/etm_key_reuse.py)
* [x] [Ataque de reutilización de clave (MAC-then-encrypt)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/mte_key_reuse.py)