Sunday, October 18, 2015

Striktni DER potpisi (BIP66)


U protokolu Bitcoin digitalni se potpisi enkodiraju u DER formatu. DER (distinguished encoding rules) je potskup BER formata (basic encoding rules) koji služi za enkodiranje podatkovnih struktura. DER format koristi se za jednoznačno enkodiranje, na primjer u kriptografskim protokolima.

Za validaciju potpisa transakcija u protokolu Bitcoin koristila se biblioteka OpenSSL. Budući da je ta biblioteka dopuštala određena odstupanja od DER formata, propisan je striktni DER format za enkodiranje potpisa. Taj format ne dopušta odstupanja te potpis koji nije u striktnom DER formatu nije validan.

Striktni DER format


Striktni DER format izgleda ovako:

0x30 [ukupna-duljina] 0x02 [R-duljina] [R-vrijednost] 0x02 [S-duljina] [S-vrijednost][tip potpisa]
 
  • Svaki DER potpis počinje bajtom 0x30.
  • Ukupna-duljina je duljina u bajtovima svega što slijedi, ne računajući bajt za tip potpisa.
  • 0x02 je bajt separatora.
  • R-duljina je bajt koji predstavlja duljina vrijednosti R u bajtovima.
  • R je vrijednost proizvoljne duljine enkodirana u big-endian formatu. Predstavlja r vrijednost u algoritmu ECDSA. Vrijednost ne može počinjati bajtom 0x00, osim ako bajt koji slijedi nije 0x80 ili veći. Ako je to slučaj, početni bajt mora biti 0x00.
  • S-duljina je bajt koji predstavlja duljina vrijednosti S u bajtovima.
  • S je vrijednost proizvoljne duljine enkodirana u big-endian formatu. Predstavlja s vrijednost u algoritmu ECDSA. Vrijednost ne može počinjati bajtom 0x00, osim ako bajt koji slijedi nije 0x80 ili veći. Ako je to slučaj, početni bajt mora biti 0x00.
  • Tip potpisa je bajt koji označuje vrstu potpisa. Dozvoljene su mu vrijednosti 0x01, 0x02, 0x03, 0x81, 0x82 te 0x83.
Ukupna duljina potpisa je najviše 72 bajta. Svi blokovi čiji rudari prepoznaju BIP66 imaju verziju 3.

Thursday, October 8, 2015

Formati ključeva


U protokolu Bitcoin postoje dvije vrste ključeva: privatni i javni. Privatni je ključ broj u rasponu od 1 do 115792089237316195423570985008687907852837564279074904382605163141518161494336. Javni ključ generira se iz privatnog množenjem privatnog ključa generatorom sliptičke krivulje. Rezultat su dva broja, x koordinata krivulje te y koordinata krivulje. Javni se i privatni ključevi radi praktičnosti zapisa ne prikauzju uvijek u decimalnom obliku.
Slijede primjeri različitih oblika zapisa ključeva. Za primjer privatnog ključa uzet je
d = 105627842363267744400190144423808258002852957479547731009248450467191077417570. Njemu pripadajući javni ključ je
Q = [40052878126280527701260741223305245603564636128202744842713277751919610658249,
 112427920116541844817408230468149218341228927370925731589596315545721129686052] gdje je prvi broj x koordinata, a drugi y koordinata eliptičke krivulje.

Privatni ključevi

Slijede formati zapisa privatnih ključeva. Duljina privatnog ključa je 32 bajta ili 256 bitova.

Heksadecimalni


Najčešći format zapisa privatnog ključe je heksadecimalni. To je ujedno i najjednostavniji zapis jer je privatni ključ potrebno samo pretvoriti u heksadecimalni oblik. Takav zapis izgledao bi ovako:
E9873D79C6D87DC0FB6A5778633389F4453213303DA61F20BD67FC233AA33262. Njegova duljina je 64 heksadecimalna znaka.

Heksadecimalni kompresirani


Još jedan jednostavni format zapisa privatnog ključa je heksadecimalni kompresirani format. Sastoji se od dodavanja bajta '0x1' na kraj ključa. Tako bi ključ iz primjera izgledao ovako: E9873D79C6D87DC0FB6A5778633389F4453213303DA61F20BD67FC233AA3326201. Duljina mu je 66 heksadecimalna znaka.

Heksadecimalni kompresirani format zapravo je dulji od normalnog heksadecimalnog formata. Naziva se kompresirani samo zato što služi za generiranje kompresiranih javnih ključeva koji umjesto 65 bajtova zauzimaju samo 33 bajta.

Wallet Import Format (WIF)

WIF je jedan od najčešćih formata zapisa privatnog ključa. Najčešće ga koriste novčanici za spremanje ključa. Postupak pretvaranja privatnog ključa u WIF format ima nekoliko koraka:
  1. Generira se privatni ključ.
  2. Na početak mu se doda bajt 0x80.
  3. Taj se niz dva puta hashira algoritmom SHA256.
  4. Od dobivenog se rezultata uzmu početna četiri bajta koji će služiti kao zaština suma.
  5. Ta se četiri bajta dodaju na kraju niza dobivenog u drugom koraku.
  6. Dobiveni se niz zatim pretvori u base58check bazu.
Za ključ iz primjera WIF je 5Kb8kLf9zgWQnogidDA76MzPL6TsZZY36hWXMssSzNydYXYB9KF. Wallet import format uvijek počinje brojem 5.

Kompresirani WIF

Kompresirani WIF sličan je normalnom WIF zapisu samo što se dobiva iz kompresiranog privatnog ključa. U koracima navedenima za dobivanje wallet import formata u drugom je koraku potrebno dodati i bajt '0x1' na kraj niza uz bajt '0x80' na početku niza. Rezultat je L53fCHmQhbNp1B4JipfBtfeHZH7cAibzG9oK19XfiFzxHgAkz6JK. Kompresirani WIF ključevi počinju s 'K' ili 'L'.

Javni ključevi

Slijede formati zapisa javnih ključeva. Duljina privatnog ključa je 64 bajta plus bajt prefiksa što daje 512, odnosno 520 bitova.

Heksadecimalni

Zapis javnog ključa u heksadecimalnom formatu je: 04 || x || y. Operator || označuje konkatenaciju, a x i y su x i y koordinate javnog ključa u heksadecimalnom obliku. Javni ključbi tad izgledao:
04588d202afcc1ee4ab5254c7847ec25b9a135bbda0f2bc69ee1a714749fd77dc9f88ff2a00d7e752d44cbe16e1ebcf0890b76ec7c78886109dee76ccfc8445424. Duljina mu je 130 heksadecimalnih znakova odnosno 65 bajtova računajući bajt prefiksa '0x4'.

Heksadecimalni kompresirani

Kompresirani javni ključ dobiva se iz kompresiranog privatnog ključa. Umjesto da se sastoji od x i y koordinate, dovoljna je samo x koordinata. Y se dobije rješavanjem jednadžbe eliptičke krivulje (y2 = x3 + 7) mod p. Da bi se jednoznačno odredio y potrebna je informacija je li on pozitivan ili negativan (odnosno, u slučaju konačnog polja, paran ili neparan). Ako je y paran, x koordinati dodaje se bajt prefiksa '0x2', ako je neparan dodaje se '0x3'. Kompresirani ključ tada izgleda ovako: 02588d202afcc1ee4ab5254c7847ec25b9a135bbda0f2bc69ee1a714749fd77dc9. U ovom je slučaju y paran pa je prefiks '0x2'. Duljina mu je 66 znakova, odnosno 33 bajta računajući bajt prefiksa.

Budući da se i kompresirani i nekompresirani javni ključevi komu koristiti za dobivanje bitcoin adresa te da će te adrese biti različite, potrebno je paziti koji se ključ koristi. O tome računa vode bitcoin novčanici koji uglavnom koriste kompresirani format budući da zauzima manje mjesta.