ECDSA Восстановление открытого ключа - PullRequest
0 голосов
/ 07 октября 2019

Helo,

Я пытаюсь восстановить открытый ключ из cookie, вот что я сделал, не уверен, что это правильно ...

1) Зарегистрируйтесь и войдите, чтобы получитьcookie:

user: test
pass: asd
cookie: dGVzdC0tMEYCIQDkk9vxwQ2A81geSQSTCxQEzGwTkA7gdYR0%2BpSr6MTNEwIhAJLLemlZFZZT6unXBg4i1WvdJy6tKVJrLQmj%2FM8SujPA

2) Расшифруйте cookie как URL:

dGVzdC0tMEYCIQDkk9vxwQ2A81geSQSTCxQEzGwTkA7gdYR0+pSr6MTNEwIhAJLLemlZFZZT6unXBg4i1WvdJy6tKVJrLQmj/M8SujPA

3) Расшифруйте cookie как base64

test--0F\x02!\x00\xE4\x93\xDB\xF1\xC1\r\x80\xF3X\x1EI\x04\x93\v\x14\x04\xCCl\x13\x90\x0E\xE0u\x84t\xFA\x94\xAB\xE8\xC4\xCD\x13\x02!\x00\x92\xCBziY\x15\x96S\xEA\xE9\xD7\x06\x0E\"\xD5k\xDD'.\xAD)Rk-\t\xA3\xFC\xCF\x12\xBA3\xC0

4) Расшифруйтечасть cookie после «-» в качестве ECDSA (DER) позволяет сказать «sig».

    ECDSA::Format::SignatureDerString.decode(sig)
<ECDSA::Signature:0x000056532e7cc928 @s=66397190700537287645903651815357348182011798486667182586289641565984306901952, @r=103388573995635080359749164254216598308788835304023601477803095234286494993683>

5) Проверьте код: (сейчас это не важно *) * ============================================================

$group = Secp256k1
$private_key = UNKNOWN

def sign(str)
    digest = Digest::SHA256.digest(str) 
    temp_key = str.size 
    signature = ECDSA.sign($group, $private_key, digest, temp_key)
end

temp_key = 'test'.size ==> 4

============================================================= *

6) ВОССТАНОВЛЕНИЕ КЛЮЧЕВОГО КЛЮЧА:

1) Проверьте, еслии r являются целыми числами:

signature.r.class
signature.s.class

2) Вычислить точку кривой R (x1, y1), где x (h) x может быть r, r + n (r + 2n и т. д.) зависит от значения h в$ group.

Конвертировать n из шестнадцатеричного числа

n = 0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFE_BAAEDCE6_AF48A03B_BFD25E8C_D0364141.ord
n = 115792089237316195423570985008687907852837564279074904382605163141518161494337

3) Рассчитать xj, когда h = 1 ==> j <= h </p>

Итак, я получил x0 = rи x1 = r + n

x0 = 103388573995635080359749164254216598308788835304023601477803095234286494993683
x1 = 219180663232951275783320149262904506162058819969664165517260679242195329665346```
# y² = x³ + 7  ==> x³ + 7 - y² = 0  ==> y = sqrt(x³ + 7)
    So there are Y that can be -Y.
y0 = (Math.sqrt(x0**3 + 7)).to_i 
y0 = 33243658930125968263381409750062872803328956523994685349884711523646619725501695561221713273581676204319400941060096

y1 = 102613229253348668425867949464551151644184036880118254846069064957181439439331464178252481009905814258844193460846592`

R0 = (x0, y0) or R0 = (x0, -y0)  ==> R0 = x0,y0 R0m = x0,-y0   (arrays)
R1 = (x1, y1) or R1 = (x1, -y1)  ==> R0 = x1,y1 R1m = x1,-y1   (arrays)

3) Рассчитать e = HASH (м)

m = "test"
e = Digest::SHA256.digest(m)
"\x9F\x86\xD0\x81\x88L}e\x9A/\xEA\xA0\xC5Z\xD0\x15\xA3\xBFO\e+\v\x82,\xD1]l\x15\xB0\xF0\n\b"
e.unpack("H*")
"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
==> IN BINARY "1001111110000110110100001000000110001000010011000111110101100101100110100010111111101010101000001100010101011010110100000001010110100011101111110100111100011011001010110000101110000010001011001101000101011101011011000001010110110000111100000000101000001000"

4) z =(Ln - первый len (n) n = 256) крайних левых бит e

z = 1000000000001000100010001000100010000000000000000000100010000000100010000000100000000000000000001000000000000000000000000000100010000000000000001000000000000000000010000000000010001000000000000000100010001000100010000000100000001000100000000000100000001000
==> IN DECIMAL 57911121712712222031468434730037426356855313884841210343156710740660779485192

5) Рассчитать u1 = -z * r ^ (- 1) mod n и u2 = s * r ^ (-1) mod n

 u1 = (-z * r**(-1)) % n
=> 11971578986221445867450691250469536884332685577127711573660715696043877254293372045122426347501727868950695322967745945196078037375262636091467191875787979/103388573995635080359749164254216598308788835304023601477803095234286494993683
u2 = (-z * s**(-1)) % n
=>(66397190700537287645903651815357348182011798486667182586289641565984306901952/103388573995635080359749164254216598308788835304023601477803095234286494993683)

6) Calculate curve point Qa = (Xa, Ya) = u1 *G + u2 * R

G = [55066263022277343669578718895168534326250603453777594175500187360389116729240, 32670510020758816978083085130507043184471273380659243275938904335757337482424]

u1.to_int = 115792089237316195423570985008687907852837564279074904382605163141518161494336  
u2.to_int = 115792089237316195423570985008687907852837564279074904382605163141518161494336

Теперь пришло время вычислить Qa для каждого R. R0, R0m, R1, R1m, но я чувствую, что потратил время впустую ... Может кто-нибудь взглянуть на это и помочь мнепонять, как восстановить открытый ключ из cookie?

Я использовал википедию [открытый ключ восстановления ecdsa]

https://en.m.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm

и эти сайты:

Ссылки:

1) https://www.instructables.com/id/Understanding-how-ECDSA-protects-your-data/

2) https://www.johndcook.com/blog/2018/08/14/bitcoin-elliptic-curves/

3) http://www.secg.org/sec1-v2.pdf

...