
क्रिप्टोग्राफ़िक हमलों और उपयोगिताओं के Python कार्यान्वयन।
क्रिप्टोग्राफ़िक हमलों और उपयोगिताओं के Python कार्यान्वयन।
आप निम्न कमांड का उपयोग करके अपने SageMath Python संस्करण की जाँच कर सकते हैं:
$ sage -python --version
Python 3.9.0
```
यदि आपका SageMath Python संस्करण 3.9.0 से पुराना है, तो कुछ स्क्रिप्ट्स की कुछ सुविधाएँ काम नहीं कर सकती हैं।
## उपयोग
यूनिट टेस्ट `test` निर्देशिका में स्थित हैं और इन्हें `unittest` मॉड्यूल या `pytest` का उपयोग करके चलाया जा सकता है। इसमें अधिक समय नहीं लगना चाहिए, शायद आपकी मशीन के आधार पर कुछ मिनट।
किसी विशेष हमले को चलाने के लिए, आपको उसे निष्पादित करने से पहले उचित फ़ाइल में कोड जोड़ना होगा।
### उदाहरण
उदाहरण के लिए, आप निम्नलिखित पैरामीटरों के साथ Boneh-Durfee हमले का उपयोग करके RSA पर हमला करना चाहते हैं ([test_rsa.py](https://github.com/jvdsn/crypto-attacks/blob/master/test/test_rsa.py) से लिया गया):```python
N = 88320836926176610260238895174120738360949322009576866758081671082752401596826820274141832913391890604999466444724537056453777218596634375604879123818123658076245218807184443147162102569631427096787406420042132112746340310992380094474893565028303466135529032341382899333117011402408049370805729286122880037249
e = 36224751658507610673165956970793195381480143363550601971796688201449789736497322700382657163240771111376677180786660893671085854060092736865293791299460933460067267613023891500397200389824179925263846148644777638774319680682025117466596019474987378275216579013846855328009375540444176771945272078755317168511
```
आप [boneh_durfee.py](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/rsa/boneh_durfee.py) फ़ाइल के निचले भाग में निम्नलिखित कोड जोड़ते हैं:```python
import logging
# Some logging so we can see what's happening.
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 = }")
```
फिर आप Sage का उपयोग करके फ़ाइल को आसानी से निष्पादित कर सकते हैं। इससे कोई फर्क नहीं पड़ता कि आप इसे कहाँ से निष्पादित करते हैं, Python path स्वतः सेट हो जाता है (आप अन्य Python फ़ाइलों से भी हमलों को कॉल कर सकते हैं, लेकिन तब आपको Python path को स्वयं ठीक करना होगा):```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
```
आउटपुट लॉग में दिखाए गए पैरामीटर `m` और `t` विशेष ध्यान देने योग्य हैं। ये पैरामीटर कई lattice-based (small roots) एल्गोरिदम में lattice के आकार को समायोजित करने के लिए उपयोग किए जाते हैं। संकल्पनात्मक रूप से, `m` (कभी-कभी `k` भी कहा जाता है) और `t` lattice में उपयोग किए गए "shifts" की संख्या को दर्शाते हैं, जो लगभग पंक्तियों की संख्या के बराबर या आनुपातिक होती है। इसलिए, `m` और `t` बढ़ाने से lattice का आकार बढ़ेगा, जिससे lattice reduction (वर्तमान में LLL का उपयोग करके) करने के लिए आवश्यक समय भी बढ़ जाता है। दूसरी ओर, यदि `m` और `t` बहुत कम हैं, तो संभव है कि lattice reduction से उपयुक्त vectors प्राप्त न हों, जिससे reduction में बिताया गया समय बर्बाद हो जाए। अतः, यह एक trade-off (समझौता) है।
परियोजना के वर्तमान संस्करण में, उपयोगकर्ता को हमेशा `m` प्रदान करना होता है (डिफ़ॉल्ट मान `1` निर्धारित है)। कुछ मामलों में, `t` की गणना attack द्वारा उपयोग की गई विशिष्ट small roots विधि के आधार पर की जा सकती है। फिर भी उपयोगकर्ता इसे समायोजित कर सकता है। सामान्यतः, इस प्रकार के पैरामीटर का उपयोग करने के दो तरीके हैं:
* एक लूप लागू करें जो `m = 1` से शुरू होकर उत्तर मिलने तक चलता है (नीचे उदाहरण)। यह एक सरल दृष्टिकोण है, लेकिन बहुत छोटे lattices के साथ व्यर्थ गणनाओं पर समय बर्बाद करने का जोखिम रहता है।```
m = 1
while True:
res = attack(..., m=m)
if res is not None:
# The attack succeeded!
break
m += 1
```
* जिस हमले का आप उपयोग करना चाहते हैं उसका एक डीबग संस्करण लागू करें (ज्ञात परिणामों के साथ), और वह `m` मान निर्धारित करें जो अच्छे जालक वैक्टर उत्पन्न करता है। फिर सही `m` मान के साथ सीधे हमले की विधि को कॉल करें।
## कार्यान्वित हमले
### अनुमानित सामान्य भाजक
* [x] [बहुचर बहुपद हमला](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/mp.py) [^acd_mp]
* [x] [ऑर्थोगोनल आधारित हमला](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/ol.py) [^acd_ol]
* [x] [एक साथ डायोफैंटाइन सन्निकटन हमला](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/acd/sda.py) [^acd_sda]
### CBC
* [x] [बिट फ़्लिपिंग हमला](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/bit_flipping.py)
* [x] [IV पुनर्प्राप्ति हमला](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/iv_recovery.py)
* [x] [पैडिंग ओरेकल हमला](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc/padding_oracle.py)
### CBC + CBC-MAC
* [x] [कुंजी पुन: उपयोग हमला (encrypt-and-MAC)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/eam_key_reuse.py)
* [x] [कुंजी पुन: उपयोग हमला (encrypt-then-MAC)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/etm_key_reuse.py)
* [x] [कुंजी पुन: उपयोग हमला (MAC-then-encrypt)](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_and_cbc_mac/mte_key_reuse.py)
### CBC-MAC
* [x] [लंबाई विस्तार हमला](https://github.com/jvdsn/crypto-attacks/blob/master/attacks/cbc_mac/length_extension.py)