Przedrostek krypto- jest nieodłącznym elementem w dyskusjach na temat KRYPTOwalut czy KRYPTOkoparek. Choć wiele osób wie co to kryptografia, nie wszyscy do końca rozumieją proces określany tym słowem przy opisywaniu KRYPTOtransakcji. W naszych artykułach możecie znaleźć już informacje o działaniu BTC , o blockchainie oraz jego działaniu. Dziś przybliżymy przebieg transakcji bitcoina i jej kryptograficzną charakterystykę.
Kryptografia – hashowanie
Kryptografia, w segmencie technologicznym zwana również kodowaniem, to nic innego jak zmiana treści w taki sposób, aby odczytać ją mogła tylko osoba znająca klucz, czyli rozwiązanie kodu.
Funkcja skrótu, algorytm hashujący czy też funkcja haszująca to algorytm komputerowy generowany w momencie uruchomienia pewnych danych wejściowych. Wynikiem takiego algorytmu jest skrót o stałej długości 32 znaków, z wykorzystaniem cyfr z zakresu 0 – 9 oraz liter a-f. Dla przykładu:
Popularną funkcją haszującą w internecie jest generator MD5. Wpisując hasło: bithub.pl otrzymujemy taki ciąg znaków:
4f3637bbe5e4b9d459b93aa6db05591e
Obliczenie pojedynczego skrótu jest bardzo szybkie. Szacuje się, że dla jednego komputera PC prędkość kodowania to aż 803 hashe na sekundę (dane z książki „Bitcoin. Wirtualna waluta internetu”Marcina Szymankiewicza ) . Co ważne, funkcja hashująca ma zawsze taki sam wynik dla tych samych danych wejściowych ( w naszym przypadku dane to: bithub.pl). Innym typem hashy które można wygenerować są 64-znakowe skróty. To właśnie ten rodzaj hashy wykorzystuje projekt Bitcoin. W kodzie, nawet bardzo mała zmiana w źródłowym zbiorze danych spowoduje, że wynik końcowy hash będzie całkiem różny od oryginalnego.
Czytam Bithub.pl
32e70b6b405cd8df95f22b4178ea33143e8ef5c8f779e45f73cfe34d6d53fd49Czytam Bithubpl
439edf6746211cf7f8d893336f60da7a1330dcd842864c1608aca8d0c9b5d703
Na powyższym przykładzie możemy zobaczyć jak niewielka zmiana ( brak kropki ) w danych wejściowych całkowicie zmieniła wartość hashu. W sieci Bitcoin funkcje te używane są przy adresach Bitcoina i powiązanymi z nimi bezpośrednio kluczach prywatnych. Dzięki nieodwracalnemu (teoretycznie) procesowi kodowania udostępnienie publicznego adresu Bitcoin nie stwarza zagrożenia dla klucza prywatnego.
Odwrotność kodowania
Wróćmy zatem do naszego 32-znakowego klucza dla danych wejściowych bithub.pl. Jak otrzymać te dane znając tylko wartość szyfrującą, w naszym przypadku: 4f3637bbe5e4b9d459b93aa6db05591e ? Pomijając różnego typu programy odkodowujące wykorzystywane przez hakerów dla większości programów dużo prościej jest zamienić dane wejściowe w klucz niż odkodować hash. Na klawiaturze mamy 26 znaków liter oraz 10 znaków cyfr. Każda z tych liter może występować w ciągu w postaci małej litery i dużej, kompletnie zmieniając znaczenie oraz wartość wyjściową. Mamy zatem 62 możliwości na każdym z miejsc (26 możliwości litery małej + 26 dużej + 10 cyfr). Nawet jeśli przypuszczamy, że wartość wyjściowa ma 9 znaków ( taką długość ma bithub.pl) to do przetestowania mamy 62^9 co daje nam 10 077 696 kombinacji.
Przy takiej ilości możliwych kombinacji i wspominanej wcześniej standardowej prędkości komputera 803 hashy/sekundę, potrzeba 116 dni na znalezienie rozwiązania. Wraz ze wzrostem ilości znaków, drastycznie wydłuża się potrzebny czas na poprawne odszyfrowanie hashu. Dla przykładu 11 znakowa wartość to 2 054 879 844 lata nieustannej pracy przeciętnego komputera Odszyfrowanie zdania składającego się z kilkudziesięciu liter jest teoretycznie niemożliwe nawet w zapisie 32 znakowym. Nawet jeśli posiadamy komputer o dużo większej mocy obliczeniowej mało prawdopodobne jest, że wartość klucza zostanie obliczona w zadowalającym nas czasie.
Przebieg transakcji
Zarówno odbieranie jak i wysyłanie wartości zakodowanych poprzez hash odbywa się za pomocą matematycznie powiązanych ze sobą dwóch kluczy: publicznego i prywatnego. Ten pierwszy to ten, który możemy udostępnić szerokiemu gronu odbiorców nie martwiąc się o posiadane na koncie środki, działa jak adres użytkownika. Klucz prywatny natomiast to najpilniej strzeżona tajemnica posiadacza kryptowalut, ponieważ jest to „klucz” do podpisywania transakcji, a jego wyjawienie daje możliwość przesłania środków na inne konto bez naszej wiedzy.
Załóżmy że Alicja chce wysłać Bobowi 1 BTC. Bob przekazuje jej swój publiczny klucz, który jest adresem transakcji. Alicja przygotowuje transakcje (w naszym przypadku jest to 1 BTC) i podpisuje ją swoim kluczem prywatnym, matematycznie powiązanym z kluczem publicznym. Zapis tej transakcji trafia do sieci, gdzie każdy może zweryfikować czy adresatem jest na pewno Alicja, dzięki upublicznionemu kluczowi publicznemu oraz podpisowi klucza prywatnego Alicji. W tym momencie po rozpowszechnieniu informacji o tej transakcji w sieci, komputery zwane kopalniami rozpoczynają swoją pracę.
Ich zadaniem jest zebrać wszystkie ogłoszone transakcje sprzed około 10 minut. Następnie zebrane transakcje są hashowane i skracane do postaci jednego ciągu i dołączane do istniejącego już poprawnego bloku. Blok istniejący natomiast jest kodem zawierającym informacje o wszystkich przeprowadzonych już operacjach od początku istnienia bitcoina i jego pierwszej transakcji „genesis” aż do ostatnich zatwierdzonych operacji. Rozwiązanie takiego bloku zaplanowane jest na czas 10 minut, stąd też kopalnie weryfikują transakcje w odstępach 10 minutowych. Jeśli któraś kopalnia poprawnie rozwiąże blok, następuje zatwierdzenie transakcji. Niektóre giełdy czy portfele w celu upewnienia się, że pieniądze zostały wysłane na pewno jeden raz i trafiły na konto odbiorcy wymagają większej ilości potwierdzeń transakcji. W tym momencie na konto Boba trafia wysłany przez Alicje 1 Bitcoin. Standardy tych zabezpieczeń są nieustannie podwyższane, można spotkać 128 czy nawet 256 bitowe wartości hashy.
Drogie Grono redakcyjne, jest w tym artykule kilka błędów merytorycznych, a nawet sami sobie w jednym momencie zaprzeczacie. „Mamy zatem 62 możliwości na każdym z miejsc (26 możliwości litery małej + 26 dużej + 10 cyfr). Nawet jeśli przypuszczamy, że wartość wyjściowa ma 9 znaków ( taką długość ma bithub.pl) to do przetestowania mamy 62^9 co daje nam 10 077 696 kombinacji.” Możliwości w tym przypadku jest 256, a nawet w podanym przykładzie”bithub.pl” wykraczacie poza błędnie podany przez Was zakres 62 możliwości (użycie znaku kropki „.”). Podejrzewam że dalsze obliczenia czasu są z tego względu również objęte błędem. Następnie: „Innym typem hashy które można wygenerować są 64-znakowe skróty. To właśnie ten rodzaj hashy wykorzystuje projekt Bitcoin. ” Projekt bitcoin wykorzystuje funkcję skrótu SHA-256, która daje 32 bajtowy wynik, a nie 64 znakowy (cokolwiek ma to oznaczać), lecz jest użyta niejako 2 razy po sobie, w celu osiągnięcia wyniku zgodnie z zasadą działania systemu proof of work. Świetnym źródłem na zrozumienie zasady poszukiwania argumentu dla danego „nonce” i innych parametrów nagłówka bloku w tym algorytmie, są kody źródłowe do archaicznych już modułów fpga firmy ztex. Producent udostępnia? (udostępniał) je na swojej stronie z dosyć szczegółowym opisem. Pozdrawiam,
mr errata
Drogie Grono redakcyjne, jest w tym artykule kilka błędów merytorycznych, a nawet sami sobie w jednym momencie zaprzeczacie. „Mamy zatem 62 możliwości na każdym z miejsc (26 możliwości litery małej + 26 dużej + 10 cyfr). Nawet jeśli przypuszczamy, że wartość wyjściowa ma 9 znaków ( taką długość ma bithub.pl) to do przetestowania mamy 62^9 co daje nam 10 077 696 kombinacji.” Możliwości w tym przypadku jest 256, a nawet w podanym przykładzie”bithub.pl” wykraczacie poza błędnie podany przez Was zakres 62 możliwości (użycie znaku kropki „.”). Podejrzewam że dalsze obliczenia czasu są z tego względu również objęte błędem. Następnie: „Innym typem hashy które można wygenerować są 64-znakowe skróty. To właśnie ten rodzaj hashy wykorzystuje projekt Bitcoin. ” Projekt bitcoin wykorzystuje funkcję skrótu SHA-256, która daje 32 bajtowy wynik, a nie 64 znakowy (cokolwiek ma to oznaczać), lecz jest użyta niejako 2 razy po sobie, w celu osiągnięcia wyniku zgodnie z zasadą działania systemu proof of work. Świetnym źródłem na zrozumienie zasady poszukiwania argumentu dla danego „nonce” i innych parametrów nagłówka bloku w tym algorytmie, są kody źródłowe do archaicznych już modułów fpga firmy ztex. Producent udostępnia? (udostępniał) je na swojej stronie z dosyć szczegółowym opisem. Pozdrawiam,
mr errata
Szanowny mr errata. Słusznie zwrócił Pan uwagę na mój błąd dotyczący znaku specjalnego w danych wejściowych. Za co bardzo przepraszam. Przy wartości wejściowej posiadającej znaki specjalne takie jak kropka w bithub.pl, mamy 95 możliwości na każdy ze znaków (26 dużych liter + 26 małych liter + 10 cyfr + 33 znaki specjalne). W przypadku słowa bithub.pl mamy zatem 95^9 kombinacji co daje wynik 630 249 409 724 609 375 ilości kombinacji. Wszystkie obliczenia są oparte na obliczeniach i wzorach zawartych w książce „Bitcoin. Wirtualna waluta internetu” autorstwa M. Szymankiewicza” str.37
Co do wagi hashu, SHA-256 wykorzystuje 32 bitowe, nie bajtowe wartości. Ale proszę zauważyć, że w całym artykule odnoszę się ciągle do ilości znaków w danym systemie. Zabieg ten ma za zadanie zwrócić uwagę na drastycznie malejące szanse odszyfrowania hashu SHA-256 (32 bitowego i 64 znakowego) w porównaniu do MD 5 (125 bitowym i 32 znakowym) hashu.
Bardzo dziękuję za merytoryczną wypowiedź i zwrócenie uwagi. Jeśli mógłby Pan przedstawić swoje obliczenia (256 kombinacji) jak i podzielić się posiadaną przez Pana wiedzą w razie ewentualnych moich pomyłek, zapraszam do kontaktu: danielczyk@bithub.pl
Artykuł zostanie poprawiony.
Pozdrawiam Dawid Danielczyk
Szanowny mr errata. Słusznie zwrócił Pan uwagę na mój błąd dotyczący znaku specjalnego w danych wejściowych. Za co bardzo przepraszam. Przy wartości wejściowej posiadającej znaki specjalne takie jak kropka w bithub.pl, mamy 95 możliwości na każdy ze znaków (26 dużych liter + 26 małych liter + 10 cyfr + 33 znaki specjalne). W przypadku słowa bithub.pl mamy zatem 95^9 kombinacji co daje wynik 630 249 409 724 609 375 ilości kombinacji. Wszystkie obliczenia są oparte na obliczeniach i wzorach zawartych w książce „Bitcoin. Wirtualna waluta internetu” autorstwa M. Szymankiewicza” str.37
Co do wagi hashu, SHA-256 wykorzystuje 32 bitowe, nie bajtowe wartości. Ale proszę zauważyć, że w całym artykule odnoszę się ciągle do ilości znaków w danym systemie. Zabieg ten ma za zadanie zwrócić uwagę na drastycznie malejące szanse odszyfrowania hashu SHA-256 (32 bitowego i 64 znakowego) w porównaniu do MD 5 (125 bitowym i 32 znakowym) hashu.
Bardzo dziękuję za merytoryczną wypowiedź i zwrócenie uwagi. Jeśli mógłby Pan przedstawić swoje obliczenia (256 kombinacji) jak i podzielić się posiadaną przez Pana wiedzą w razie ewentualnych moich pomyłek, zapraszam do kontaktu: danielczyk@bithub.pl
Artykuł zostanie poprawiony.
Pozdrawiam Dawid Danielczyk