
Implémentations Python d'attaques cryptographiques et d'utilitaires.
Implémentations Python d'attaques et d'utilitaires cryptographiques.
Vous pouvez vérifier la version Python de SageMath à l'aide de la commande suivante :``` $ sage -python --version Python 3.9.0
Si votre version Python de SageMath est antérieure à 3.9.0, certaines fonctionnalités de certains scripts pourraient ne pas fonctionner.
## Utilisation
Les tests unitaires se trouvent dans le répertoire `test` et peuvent être exécutés à l’aide du module `unittest` ou de `pytest`. Cela ne devrait pas prendre très longtemps, peut-être quelques minutes selon votre machine.
Pour exécuter une attaque spécifique, vous devez ajouter le code au fichier approprié avant de l’exécuter.
### Exemple
Par exemple, vous souhaitez attaquer RSA à l’aide de l’attaque Boneh-Durfee, avec les paramètres suivants (tirés de [test_rsa.py](https://github.com/jvdsn/crypto-attacks/blob/master/test/test_rsa.py)) :```python
N = 88320836926176610260238895174120738360949322009576866758081671082752401596826820274141832913391890604999466444724537056453777218596634375604879123818123658076245218807184443147162102569631427096787406420042132112746340310992380094474893565028303466135529032341382899333117011402408049370805729286122880037249
e = 36224751658507610673165956970793195381480143363550601971796688201449789736497322700382657163240771111376677180786660893671085854060092736865293791299460933460067267613023891500397200389824179925263846148644777638774319680682025117466596019474987378275216579013846855328009375540444176771945272078755317168511
Vous ajoutez le code suivant en bas du fichier 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 = }")
Ensuite, vous pouvez simplement exécuter le fichier avec Sage. Peu importe d'où vous l'exécutez, le chemin Python est automatiquement défini (vous pouvez également appeler les attaques depuis d'autres fichiers Python, mais dans ce cas, vous devrez corriger le chemin Python vous-même) :```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
Les paramètres m et t tels qu'affichés dans le journal de sortie méritent une attention particulière. Ces paramètres sont utilisés dans de nombreux algorithmes à base de réseaux (petites racines) pour ajuster la taille du réseau. Conceptuellement, m (parfois appelé k) et t représentent le nombre de « décalages » utilisés dans le réseau, ce qui est à peu près égal ou proportionnel au nombre de lignes. Par conséquent, augmenter m et t augmentera la taille du réseau, ce qui augmente également le temps nécessaire pour effectuer la réduction du réseau (actuellement en utilisant LLL). D'un autre côté, si m et t sont trop faibles, il est possible que la réduction du réseau ne produise pas des vecteurs appropriés, gaspillant ainsi le temps passé à réduire. Il s'agit donc d'un compromis.
Dans la version actuelle du projet, m doit toujours être fourni par l'utilisateur (la valeur par défaut est définie sur 1). t peut, dans certains cas, être calculé en fonction de la méthode spécifique des petites racines utilisée par l'attaque. Cependant, il peut toujours être ajusté par l'utilisateur. En général, il existe deux façons d'utiliser ce type de paramètres :
m = 1 jusqu'à ce qu'une réponse soit trouvée (exemple ci-dessous). C'est une approche simple, mais elle risque de perdre du temps dans des calculs inutiles avec des réseaux trop petits.```
m = 1
while True:
res = attack(..., m=m)
if res is not None:
# The attack succeeded!
break
m += 1* Implémentez une version de débogage de l'attaque que vous essayez d'utiliser (avec des résultats connus), puis déterminez la valeur `m` qui produit de bons vecteurs de réseau. Appelez ensuite directement la méthode d'attaque avec la valeur `m` correcte.
## Attaques implémentées
### Diviseur commun approché
* [x] [Attaque par polynômes multivariés](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/mp.py) [^acd_mp]
* [x] [Attaque basée sur l'orthogonalité](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/ol.py) [^acd_ol]
* [x] [Attaque par approximation diophantienne simultanée](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/sda.py) [^acd_sda]
### CBC
* [x] [Attaque par retournement de bits](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/bit_flipping.py)
* [x] [Attaque de récupération de l'IV](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/iv_recovery.py)
* [x] [Attaque par oracle de bourrage](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/padding_oracle.py)