Dekoder łańcucha kodowań

Tekst, który przeszedł przez więcej niż jeden koder, to normalny przypadek, a nie egzotyczny: treść JSON w tokenie Base64, URL w linii logu, wartość formularza zakodowana procentowo, a potem w Base64, żeby mogła przejść w nagłówku. Ta strona odwija te warstwy po jednej, nazywa technikę użytą w każdym kroku, podaje, jak pewna jest i dlaczego, i wypisuje techniki, które odrzuciła w tym kroku, abyś mógł się z nią nie zgodzić. Zatrzymuje się, gdy tekst przestaje wyglądać na zakodowany, gdy osiągnie limit kroków albo gdy kolejny krok przywróciłby tekst, który już widziała. Nic nie jest zgadywane po cichu: technika, której alfabet pokrywa się ze zwykłymi słowami, nigdy nie jest stosowana sama, a jedynie zaproponowana.
Całe przetwarzanie odbywa się lokalnie w przeglądarce — Dane nigdy nie są wysyłane na żaden serwer.

Pierwszy raz tu? Łańcuchy kodowań wyjaśnione prostym językiem — czym jest warstwa, dlaczego kodowanie nie jest szyfrowaniem i dlaczego kolejność kroków ma znaczenie.
Stosuj warstwę samodzielnie tylko wtedy, gdy pewność wynosi co najmniej:
Zatrzymaj po
Uruchamia powyższy limit warstw za jednym razem. Ta sama tabela powstaje w obu trybach, więc można przełączyć się na krokowanie w dowolnym momencie.
Albo wybierz technikę ręcznie:
Ta lista to to, co strona widzi w tekście w tej chwili. Szyfry rotacyjne są na niej zawsze, bo nie da się ich wykryć wcale; jest na niej także wszystko, co staje się rozpoznawalne dopiero po usunięciu białych znaków z zawiniętego tekstu — oznaczone jako takie i nigdy nie stosowane samodzielnie.
To wejście jest dłuższe, niż ta strona lubi uruchamiać bez pytania, a powyższy szacunek mówi, że może to potrwać . Naciśnij ponownie Rozwiń cały łańcuch, aby mimo to kontynuować, albo najpierw skróć tekst.
(najpierw wpisz lub wklej coś)
(łańcuch pojawi się tutaj)
Czym jest łańcuch kodowań i dlaczego potrzebuje własnego dekodera?

Warstwa to jeden koder zastosowany do tekstu. Łańcuch to dwie lub więcej takich warstw zastosowanych jedna po drugiej. Niemal każdy codzienny przykład wygląda tak: ktoś musi umieścić fragment danych binarnych — obraz, podpisany token — w miejscu, które przenosi tylko tekst, więc koduje to w Base64. Wynik Base64 musi następnie przejść w URL, więc jest kodowany procentowo. Cały URL trafia do linii logu albo pliku konfiguracyjnego, więc ukośniki lub cudzysłowy też są escapowane. To, co widać w problemie, to najbardziej zewnętrzna warstwa, i jest nieczytelna z prostego powodu: wewnętrzne warstwy wciąż są założone.

Dekodery jednego przeznaczenia tu nie pomagają. Dekoder Base64 podany JTI2bHQlM0JiJTI2Z3QlM0JoaSUyNmx0JTNCJTJGYiUyNmd0JTNC zwróci całkiem poprawną odpowiedź, która wciąż jest nieczytelna, bo escape'y procentowe i odwołania do znaków wciąż leżą na wierzchu tekstu, którego chciano. Potrzebne jest coś, co na każdym kroku rozstrzyga, który koder zdjąć — i ta strona jest tą decyzją uczynioną widoczną.

Kodowanie nie jest szyfrowaniem i ta strona niczego nie łamie. Każda technika na tej stronie to jawny, odwracalny sposób zapisu tej samej informacji. Base64 nie ma klucza. Kodowanie procentowe nie ma klucza. Jeśli najgłębsza warstwa jest zaszyfrowana, strona zdekoduje zewnętrzne warstwy i poda szyfrogram, mówiąc to wprost zamiast udawać wynik. Nie ma tu nic do uruchomienia i nic do ukrycia.
Przykłady robocze na tej stronie

Każdy wiersz poniżej to prawdziwe wejście z pliku danych tej strony, a środkowa kolumna to to, co odwijacz strony znajduje w nim. Ostatnia kolumna to tekst, który zostaje, gdy się zatrzymuje.

Czym jest wejście Znalezione warstwy Wejście, zacytowane tak, jak przyszło Zostało, gdy się zatrzymuje

Te wiersze są generowane przez stronę z jej własnej listy przypadków i uruchamiane ponownie przy każdym wejściu, więc nie mogą rozjechać się z tym, co robi kod. Poniższy samotest sprawdza każdy z nich.

Jak strona decyduje, którą warstwę zdjąć
  1. Patrz na kształt, nie na znaczenie. Każda technika ma sygnaturę — znak procentowy, parzysty ciąg cyfr szesnastkowych, alfabet i długość pasujące do Base64. Strona wypisuje każdą technikę, której sygnatura pasuje do tekstu, z pewnością między 0 a 1.
  2. Dekoduj, a potem sprawdź, czy wynik jest tekstem. Technika warta zastosowania to taka, która daje coś czytelnego. Każdy kandydat jest faktycznie uruchamiany, a jego wynik jest oceniany według tego, jaka część to drukowalne znaki.
  3. Stosuj tylko to, co przekracza poprzeczkę, w kolejności pewności. Najpewniejszy kandydat powyżej progu jest stosowany, a proces powtarza się na wyniku. Poniżej progu techniki są wypisywane, ale nie stosowane.
  4. Jedna reguła, którą strona dodaje ponad to. Nawet gdy technika przekracza próg, strona nie zastosuje jej sama, chyba że wynik jest naprawdę czytelnym tekstem — znaki zastępcze i znaki sterujące liczą się przeciwko niemu. Bez tej reguły zwykłe słowo cafe zostałoby poprawnie zdekodowane jako trzy bajty, które są drukowalne tylko w Latin-1, a getUserName jako osiem bajtów szumu. Detektor ma rację, że te ciągi pasują do alfabetu; strona uznaje, że samo pasowanie do alfabetu nie wystarcza. Nadal można je zastosować ręcznie, a lista kandydatów powie, że odmówiono i dlaczego.
  5. Zatrzymanie, celowe. Gdy żadna technika nie przekracza poprzeczki, gdy tekst przestaje się zmieniać, gdy osiągnięto limit kroków albo gdy kolejny krok przywróciłby tekst, który już pojawił się w tym łańcuchu. Ten ostatni punkt jest ważny: ROT13 jest swoją własną odwrotnością, więc łańcuch, który pozwoliłby na ten krok dwukrotnie, nigdy by się nie skończył.
  6. Tekst zawinięty jest proponowany, nigdy nie stosowany. Jeśli tekst jest rozcięty na kilka wierszy, detektor widzi białe znaki, czyta zwykłą prozę i niczego nie znajduje. Więc strona usuwa białe znaki z kopii tekstu, pyta detektor ponownie i proponuje to, co znajdzie, jako krok do wyboru ręcznie. Usunięcie białych znaków z tekstu to przepisanie tekstu, a ta strona niczego nie przepisuje bez wyraźnej prośby.
Czego ta strona nie zrobi
Dekoduje i nic więcej. Wklejony tekst nigdy nie jest wykonywany: brak eval, brak new Function, brak wstrzykiwania skryptów, brak otwierania dokumentów. Nigdy nie jest wysyłany: brak wysyłania, brak żądań, brak analityki. Poza miejscem na reklamę na dole strony i rzędem przycisków udostępniania (to jedyne dwa zewnętrzne widżety, jakie ta strona ładuje), żadna czcionka ani skrypt nie są pobierane z innego hosta. Zdekodowany wynik jest wpisywany na stronę jako tekst, więc znacznik HTML wychodzący z warstwy jest wyświetlany jako znacznik, a nie zamieniany w znacznik. Można to sprawdzić: naciśnij Samotest, a sprawdzi on kod źródłowy tej strony pod kątem tych konstrukcji i zawiedzie, jeśli coś znajdzie.
Co potrafi rozpoznać, a czego nie
Technika Jak pewna sama z siebie Haczyk

Tekst cytowany na tej stronie jest napisany dla tej witryny. Alfabety Base64, Base32, Base58, Base91 i quoted-printable oraz format bloków uuencode to opublikowane definicje; dekodowanie idzie według tych definicji, a nie według osobliwości jakiegokolwiek narzędzia. Wektory referencyjne alfabetów znajdują się na sąsiednich stronach, które zawierają wektory testowe RFC 4648.

Tekst zawinięty na kilka wierszy

Blob, który przeszedł przez wiadomość e-mail, plik PEM, token w nagłówku albo skrót wklejony z terminala, jest zwykle zawinięty: koder złamał go w stałej kolumnie — 76 znaków to konwencja MIME — i wstawił znak nowej linii tam, gdzie kolumna się kończyła. Te podziały wierszy nie są częścią danych. Istnieją po to, by długa linia przetrwała transport, i każdy dekoder czytający taki blob ma je ignorować.

Ta strona sama ich nie ignoruje, a powód to reguła, której używa wszędzie indziej. Białe znaki to najsilniejszy pojedynczy znak, że ciąg jest prozą, a nie danymi; to ten test nie pozwala odczytać The quick brown fox jumps over the lazy dog. jako czegokolwiek. Zawinięty blob wygląda dla tego testu dokładnie jak proza, więc strona nic w nim nie znajduje — i wtedy wykonuje uczciwą połowę pracy: ustala, co by znalazła, gdyby usunąć białe znaki, wypisuje to na liście wyboru ręcznego oznaczonej najpierw usuń białe znaki, i na tym się zatrzymuje. Jest wypisany, a nie zastosowany, bo usunięcie białych znaków zmienia tekst, a ta strona zmienia tekst tylko wtedy, gdy może udowodnić, jaka jest zmiana. Tutaj może to udowodnić i mimo to odmawia jej zrobienia w czyimkolwiek imieniu, bo tekst z podziałem wiersza w środku wartości i tekst z podziałem wiersza między dwoma polami wyglądają od środka tak samo.

Dwa kroki, gdy strona zatrzymuje się na tekście zawiniętym. Przełącz na Krok po kroku ręcznie, naciśnij Zastosuj następną warstwę raz (to daje stronie łańcuch, do którego może dodawać, i niczego nie zmienia), a potem wybierz wpis oznaczony najpierw usuń białe znaki i naciśnij Zastosuj. Wiersz, który powstaje, mówi, ile znaków białych zostało usuniętych, i podaje rozmiar wejścia jako wklejony tekst, więc różnica między dwiema liczbami w tym wierszu to dokładnie te białe znaki, które zostały usunięte.

To samo rozumowanie obejmuje przypadki odwrotne. Blok uuencode niesie linię begin i znak długości w każdym wierszu, więc rozpoznaje się go jako taki i stosuje samodzielnie; treść quoted-printable zachowuje własne miękkie podziały wierszy i jest dekodowana przez własny dekoder, który wie, że pojedynczy końcowy = na końcu wiersza to kontynuacja, a nie dane. Tam, gdzie test kształtu nie potrafi odróżnić prozy od danych, strona odmawia i pokazuje alternatywę, zamiast wybierać za użytkownika.

Co ta strona uruchomi, a czego odmówi

Poniższa tabela jest zbudowana z tych samych stałych, które strona egzekwuje, więc wiersz i ostrzeżenie na tej stronie nie mogą się rozjechać. Dwie liczby, które zaskakują ludzi, to wiersze Base58 i Base62: te dwie techniki są konwertowane długim dzieleniem, którego koszt rośnie z kwadratem długości, więc ta strona uruchamia je tylko na krótkim ciągu i mówi o tym w kroku zamiast wyglądać na zawieszoną.

Szacunki są celowo pesymistyczne. Pochodzą z harnessu pomiarowego, a nie z komputera, a komputer stacjonarny zwykle jest kilkukrotnie szybszy od pokazanej wartości.