Title: Czym jest "tagged hash", czyli "oznaczony skrót"? Post by: vjudeu on October 16, 2023, 09:25:29 PM Skoro już zostałem wywołany do tablicy, to skrobnę coś niecoś na ten temat. Tym razem po polsku, prosto w tej sekcji, w końcu trzeba zrobić tutaj trochę ruchu, bo coś zbyt pusto się tu robi.
Zatem do rzeczy: czym jest "oznaczony skrót"? Jak zapewne niektórzy zauważyli, swego czasu opisałem szczegółowo na anglojęzycznych częściach, jak działają funkcje skrótu, rozłożone na czynniki pierwsze: Dlaczego funkcje skrótu są bezpieczne? (https://bitcointalk.org/index.php?topic=5402178) Wzmocnione SHA-1 kontra osłabione SHA-256: Jak je testować? (https://bitcointalk.org/index.php?topic=5467882) Na podstawie tych dwóch tematów wyżej (a zwłaszcza tego pierwszego, gdzie pokazuję podział na wektor inicjalizacyjny, dane, oraz hash końcowy) można zademonstrować, czym tak naprawdę jest "oznaczony skrót". Wróćmy do obrazka, który pokazałem w tamtym temacie: Code: wektor inicjalizacyjny: 67452301 efcdab89 98badcfe 10325476 c3d2e1f0 Następnie mamy wiadomość, w przypadku SHA-1 oraz SHA-256, składającą się z 512-bitowego zestawu, który jest odpowiednio rozszerzany. Obie wymienione funkcje skrótu implementują samą wiadomość identycznie, nawet sposób dokładania jedynki na końcu, zer w celu wyrównania danych, a także 64-bitowego rozmiaru całości w bitach, wygląda dokładnie tak samo. Różnice występują dopiero przy rozszerzaniu wiadomości na kolejne rundy. Ostatecznie, uzyskujemy skrót końcowy, który przy tych samych danych wejściowych, będzie zawsze identyczny. Oznacza to tyle, że SHA-1 pustej wiadomości zawsze i wszędzie wynosi dokładnie "da39a3ee 5e6b4b0d 3255bfef 95601890 afd80709". W przeciwieństwie do poprzedniego tematu, tutaj zakładamy, że mamy do czynienia z więcej niż jednym blokiem danych. Dlaczego? Otóż cała idea oznaczonego skrótu polega właśnie na tym, aby wykorzystać atak rozszerzający wiadomość (https://en.wikipedia.org/wiki/Length_extension_attack) i zamienić go w coś pożytecznego. Spróbujmy zatem wykonać właśnie ten atak na dwóch blokach i zobaczyć, co nam z tego wyjdzie. Zaatakujmy pusty blok w taki sposób, aby dołożyć kolejny pasujący blok, dokładając tylko tyle danych, ile musimy: Code: wektor inicjalizacyjny: 67452301 efcdab89 98badcfe 10325476 c3d2e1f0 I właśnie na tym polega ten słynny oznaczony skrót, używany w Taproocie. Zamiast używać typowego wektora inicjalizacyjnego, mamy do czynienia z jakimiś danymi początkowymi, które zmieniają nam wektor inicjalizacyjny i sprawiają, że startujemy od innej wartości niż zwykle. Przejdźmy zatem do SHA-256 i zobaczmy, jak to wygląda w praktyce. Naszym źródłem będzie tutaj BIP-340 (https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki): Quote This proposal suggests to include the tag by prefixing the hashed data with SHA256(tag) || SHA256(tag). Because this is a 64-byte long context-specific constant and the SHA256 block size is also 64 bytes, optimized implementations are possible (identical to SHA256 itself, but with a modified initial state). Using SHA256 of the tag name itself is reasonably simple and efficient for implementations that don't choose to use the optimization. In general, tags can be arbitrary byte arrays, but are suggested to be textual descriptions in UTF-8 encoding. W tym przypadku, implementacja Taproota korzysta z faktu, że blok danych składa się z 512 bitów, zaś SHA-256 produkuje nam dokładnie 256-bitowy skrót. Bierzemy zatem dwa takie skróty i łączymy ze sobą, uzyskując wiadomość z pierwszego bloku. Następnie obliczamy skrót pośredni i od tej pory nie musimy już liczyć go ponownie, tylko wykorzystujemy go odtąd jako nasz nowy wektor inicjalizacyjny. Zobaczmy zatem, jak to wygląda na praktycznych przykładach:Code: SHA-256("BIP0340/challenge")=7bb52d7a9fef58323eb1bf7a407db382d2f3f2d81bb1224f49fe518f6d48d37c Code: tagged_hash("BIP0340/nonce")=5301f1001a8be6253a3583927793565cef360de8bac2bdcbf37b195e699435a8 Planuję jeszcze odgrzebać stare tematy związane z Taprootem, bo z tego co pamiętam, tam mogły być też używane takie hashe, bodajże przy tworzeniu klucza publicznego, który może być wydany tylko przez pojedynczą sygnaturę Schnorra, bez żadnego TapScriptu. Poszukam i postaram się to uzupełnić, na razie kończę w tym miejscu. Zachęcam do pytań, żeby wiedzieć, w jakim kierunku pisać i czy w ogóle chcecie tego więcej, czy też idę w zbyt ciężkostrawne technikalia i powinienem zacząć od przetłumaczenia swoich starszych wpisów o funkcjach skrótu, zanim dotknę oznaczonych skrótów i innych nowszych tematów. |