
Python-Implementierungen von kryptografischen Angriffen und Hilfsprogrammen.
Python-Implementierungen von kryptografischen Angriffen und Hilfsprogrammen.
Sie können Ihre SageMath-Python-Version mit dem folgenden Befehl überprüfen:``` $ sage -python --version Python 3.9.0
Wenn Ihre SageMath-Python-Version älter als 3.9.0 ist, funktionieren einige Funktionen in einigen Skripten möglicherweise nicht.
## Verwendung
Die Unit-Tests befinden sich im Verzeichnis `test` und können mit dem Modul `unittest` oder mit `pytest` ausgeführt werden. Dies sollte nicht sehr lange dauern, vielleicht ein paar Minuten, je nach Ihrer Maschine.
Um einen bestimmten Angriff auszuführen, müssen Sie den Code vor der Ausführung in die entsprechende Datei einfügen.
### Beispiel
Angenommen, Sie möchten RSA mit dem Boneh-Durfee-Angriff angreifen, mit den folgenden Parametern (entnommen aus [test_rsa.py](https://github.com/jvdsn/crypto-attacks/blob/master/test/test_rsa.py)):```python
N = 88320836926176610260238895174120738360949322009576866758081671082752401596826820274141832913391890604999466444724537056453777218596634375604879123818123658076245218807184443147162102569631427096787406420042132112746340310992380094474893565028303466135529032341382899333117011402408049370805729286122880037249
e = 36224751658507610673165956970793195381480143363550601971796688201449789736497322700382657163240771111376677180786660893671085854060092736865293791299460933460067267613023891500397200389824179925263846148644777638774319680682025117466596019474987378275216579013846855328009375540444176771945272078755317168511
Sie fügen den folgenden Code am Ende der Datei boneh_durfee.py hinzu:```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 = }")
Dann kannst du die Datei einfach mit Sage ausführen. Es spielt keine Rolle, von wo aus du sie ausführst, der Python-Pfad wird automagisch gesetzt (du kannst die Angriffe auch aus anderen Python-Dateien aufrufen, musst dann aber den Python-Pfad selbst korrigieren):```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
Die Parameter m und t im Ausgabeprotokoll verdienen besondere Aufmerksamkeit. Diese Parameter werden in vielen gitterbasierten (small roots) Algorithmen verwendet, um die Gittergröße abzustimmen. Konzeptionell repräsentieren m (manchmal auch k genannt) und t die Anzahl der „Shifts“, die im Gitter verwendet werden, was ungefähr der Anzahl der Zeilen entspricht oder proportional zu ihr ist. Daher erhöht eine Vergrößerung von m und t die Größe des Gitters, was wiederum die Zeit erhöht, die für die Gitterreduktion (derzeit mit LLL) benötigt wird. Sind m und t hingegen zu niedrig, kann die Gitterreduktion unter Umständen keine geeigneten Vektoren liefern, wodurch die für die Reduktion aufgewendete Zeit verschwendet wird. Es handelt sich also um einen Kompromiss.
In der aktuellen Version des Projekts muss m immer vom Benutzer angegeben werden (der Standardwert ist auf 1 gesetzt). t kann in manchen Fällen basierend auf der spezifischen Small-Roots-Methode berechnet werden, die der Angriff verwendet. Es kann jedoch weiterhin vom Benutzer angepasst werden. Im Allgemeinen gibt es zwei Möglichkeiten, diese Art von Parametern zu verwenden:
m = 1 beginnt, bis eine Antwort gefunden wird (Beispiel unten). Dieser Ansatz ist einfach, birgt jedoch das Risiko, Zeit mit aussichtslosen Berechnungen zu verschwenden, wenn die Gitter zu klein sind.```
m = 1
while True:
res = attack(..., m=m)
if res is not None:
# The attack succeeded!
break
m += 1* Implementieren Sie eine Debug-Version des Angriffs, den Sie verwenden möchten (mit bekannten Ergebnissen), und bestimmen Sie den `m`-Wert, der zu guten Gittervektoren führt. Rufen Sie dann die Angriffsmethode direkt mit dem korrekten `m`-Wert auf.
## Implementierte Angriffe
### Approximativer gemeinsamer Teiler
* [x] [Multivariater Polynomangriff](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/mp.py) [^acd_mp]
* [x] [Orthogonal-basierter Angriff](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/ol.py) [^acd_ol]
* [x] [Angriff durch simultane diophantische Approximation](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/sda.py) [^acd_sda]
### CBC
* [x] [Bit-Flipping-Angriff](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/bit_flipping.py)
* [x] [IV-Wiederherstellungsangriff](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/iv_recovery.py)
* [x] [Padding-Orakel-Angriff](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/padding_oracle.py)