Avkodare för kodningskedjor — varje lager namngivet, varje gissning märkt
Avkodare för kodningskedjor
Text som har passerat fler än en kodare är det normala fallet, inte det exotiska: en JSON-body inuti en Base64-token, en URL i en loggrad, ett formulärvärde som först procent-kodades och sedan Base64-kodades för att kunna skickas i en header. Den här sidan rullar upp de lagren ett i taget, anger tekniken den använde i varje steg, skriver ut hur säker den är och varför, och listar de tekniker den förkastade i det steget så att man kan ifrågasätta den. Den slutar när texten slutar se kodad ut, när den når stegbegränsningen, eller när nästa steg skulle ge tillbaka text som redan setts. Ingenting gissas tyst: en teknik vars alfabet överlappar vanliga ord tillämpas aldrig på egen hand, den erbjuds bara. All bearbetning sker lokalt i webbläsaren — data laddas aldrig upp till någon server.
Tillämpa ett lager på egen hand bara när säkerheten är minst:
Stoppa efter
Kör lagerbegränsningen ovan i ett svep. Samma tabell byggs i båda fallen, så man kan byta till steg för steg var som helst.
Eller välj en teknik för hand:
Den här listan är vad sidan kan se i texten just nu. Rotationschiffer finns alltid med, eftersom de inte alls kan detekteras; likaså allt som bara blir igenkännbart när blanksteg tagits bort ur en inslagen text, vilket är markerat som sådant och aldrig tillämpas på egen hand.
Kodad text
Indatan är längre än vad sidan brukar köra utan att fråga, och uppskattningen ovan säger att det kan ta . Tryck på Rulla upp hela kedjan igen för att fortsätta ändå, eller korta ner texten först.
Vad sidan ser i texten just nu
(skriv eller klistra in något först)
(kedjan visas här)
Lager, i den ordning de togs bort
#
Teknik
Konfidens
Indata → resultat
Storlek
Varför just denna
Per lager
Kopiera tar texten såsom den var efter det lagret. Återställ tar bort det lagret och alla lager ovanför, vilket är hur man ångrar fler än ett steg i taget.
Resultat efter0lager(inget ännu)
Vad är en kodningskedja, och varför behöver den en egen avkodare?
Ett lager är en kodare tillämpad på text. En kedja är två eller flera av dem tillämpade i följd. Nästan alla vardagsexempel ser ut så här: någon behöver lägga binärdata — en bild, en signerad token — på en plats som bara bär text, så de Base64-kodar den. Det Base64-resultatet måste sedan färdas i en URL, så det procent-kodas. Hela URL:en läggs sedan i en loggrad eller en konfigurationsfil, så snedstreck eller citattecken kodas också. Det man ser när problemet uppstår är det yttersta lagret, och det är oläsligt av den enkla anledningen att de inre lagren fortfarande sitter kvar.
Avkodare för ett enda ändamål hjälper inte mot det. En Base64-avkodare som får JTI2bHQlM0JiJTI2Z3QlM0JoaSUyNmx0JTNCJTJGYiUyNmd0JTNC ger ett helt korrekt svar som ändå är oläsligt, eftersom procent-escapesna och teckenreferenserna fortfarande ligger ovanpå texten man ville ha. Det man faktiskt behöver är något som avgör, i varje steg, vilken kodare som ska tas bort — och den här sidan är det beslutet synliggjort.
Kodning är inte kryptering, och den här sidan bryter ingenting. Varje teknik på sidan är ett offentligt, reversibelt sätt att skriva ned samma information. Base64 har ingen nyckel. Procentkodning har ingen nyckel. Om det innersta lagret är krypterat avkodar sidan de yttre lagren och lämnar chifferteksten, vilket den säger rakt ut i stället för att låtsas vara ett resultat. Det finns inget att köra här och inget att dölja.
Genomgångna exempel på den här sidan
Varje rad nedan är en verklig indata från sidans datafil, och mittkolumnen är vad sidans egen avrullare hittar i den. Den sista kolumnen är texten som återstår när den stannar.
Vad indatan är
Hittade lager
Indata, citerad som den kom
Kvar när den stannar
De här raderna renderas av sidan från dess egen fallista och körs om vid varje besök, så de kan inte glida ifrån vad koden gör. Självtestet nedan kontrollerar var och en.
Så avgör sidan vilket lager som ska tas bort
Titta på formen, inte på betydelsen. Varje teknik har en signatur — en procent-escape, en jämn följd hexsiffror, ett alfabet och en längd som passar Base64. Sidan listar varje teknik vars signatur stämmer med texten, med en säkerhetsgrad mellan 0 och 1.
Avkoda, och kontrollera sedan om resultatet är text. En teknik är bara värd att tillämpa om den ger något läsbart. Varje kandidat körs faktiskt, och dess utdata poängsätts efter hur stor del av den som är utskrivbara tecken.
Tillämpa bara det som klarar ribban, i ordning efter säkerhet. Kandidaten med högst säkerhet över tröskeln tillämpas, och processen upprepas på resultatet. Under tröskeln listas teknikerna men tillämpas inte.
En regel som sidan lägger ovanpå. Även när en teknik klarar tröskeln tillämpar den här sidan den inte på egen hand om resultatet inte är verklig läsbar text — ersättningstecken och styrtecken räknas emot. Utan den regeln skulle det vanliga ordet cafe giltigt avkodas som tre byte som bara är utskrivbara i Latin-1, och getUserName som åtta byte brus. Detektorn har rätt i att de strängarna passar alfabetet; den här sidan avgör att det inte räcker att passa alfabetet. Det går fortfarande att tillämpa dem för hand, och kandidatlistan säger att den avstod och varför.
Stanna, avsiktligt. När ingen teknik klarar ribban, när texten slutar ändras, när stegbegränsningen nås, eller när nästa steg skulle ge tillbaka text som redan förekommit i kedjan. Det sista steget är viktigt: ROT13 är sin egen invers, så en kedja som fick ta det steget två gånger skulle aldrig sluta.
En inslagen text erbjuds, tillämpas aldrig. Om texten är delad över flera rader ser detektorn blanksteg, läser vanlig prosa och hittar ingenting. Därför tar sidan bort blanksteg ur en kopia av texten, frågar detektorn igen och erbjuder det den hittar som ett steg att välja för hand. Att ta bort blanksteg ur indatan är en omskrivning av texten, och den här sidan skriver inte om något som inte bett om att skrivas om.
Vad den här sidan inte gör
Den avkodar, och inget annat. Texten som klistras in körs aldrig: ingen eval, ingen new Function, ingen skriptinjektion, inget dokument öppnas. Den skickas aldrig någonstans: ingen uppladdning, ingen förfrågan, ingen analys. Utöver annonsplatsen längst ned på sidan och raden med delningsknappar (de enda två widgetarna från tredje part som den här sidan laddar) hämtas inget typsnitt eller skript från någon annan värd. Avkodad utdata skrivs in på sidan som text, så en HTML-tagg som kommer ut ur ett lager visas som en tagg och görs inte till en. Det går att kontrollera allt det: tryck på Självtest och den kontrollerar sidans egen källkod efter någon av dessa konstruktioner och misslyckas om den hittar en.
Vad den kan känna igen, och vad den inte kan
Teknik
Hur säker, var för sig
Haken
Text som citeras på den här sidan är skriven för den här webbplatsen. Alfabeten för Base64, Base32, Base58, Base91 och quoted-printable samt uuencode-blockformatet är de publicerade; avkodningen följer de definitionerna snarare än något enskilt verktygs egenheter. Referensvektorer för alfabeten finns på systersidorna, som innehåller RFC 4648-testvektorerna.
Text som kommer inslagen över flera rader
En blob som passerat ett e-postmeddelande, en PEM-fil, en token i en header eller ett hash som klistrats in från en terminal är oftast inslagen: kodaren bröt den vid en fast kolumn — 76 tecken är MIME-konventionen — och satte in en radbrytning där kolumnen tog slut. De radbrytningarna är inte en del av datan. De finns för att en lång rad ska överleva transporten, och varje avkodare som läser en sådan blob förväntas ignorera dem.
Den här sidan ignorerar dem inte av egen kraft, och skälet är regeln den använder överallt annars. Blanksteg är det starkaste enskilda tecknet på att en sträng är prosa snarare än data, och det är testet som hindrar The quick brown fox jumps over the lazy dog. från att läsas som något alls. En inslagen blob ser precis ut som prosa för det testet, så sidan hittar ingenting i den — och gör sedan den ärliga halvan av arbetet: den räknar ut vad den skulle hitta om blanksteget togs bort, listar det i handväljaren märkt blanksteg bort först, och stannar där. Det listas i stället för att tillämpas eftersom borttagning av blanksteg ändrar texten, och den här sidan ändrar bara text när den kan bevisa vad ändringen är. Här kan den bevisa vad ändringen är, och avstår ändå från att göra den åt användaren, eftersom en text med en radbrytning mitt i ett värde och en text med en radbrytning mellan två fält ser likadana ut inifrån.
De två stegen när sidan stannar vid en inslagen text. Byt till Steg för steg manuellt, tryck på Tillämpa nästa lager en gång (det är det som ger sidan en kedja att lägga till i, och det ändrar ingenting), välj sedan posten markerad blanksteg bort först och tryck på Tillämpa den. Raden som tillkommer anger hur många blanktecken som togs bort, och anger sin indatastorlek som den text som klistrades in, så skillnaden mellan de två talen i raden är exakt de blanksteg som togs bort.
Samma resonemang gäller fallen åt andra hållet. Ett uuencode-block bär en begin-rad och ett längdtecken på varje rad, så det går att känna igen som det är och tillämpas på egen hand; en quoted-printable-kropp behåller sina egna mjuka radbrytningar och avkodas av sin egen avkodare, som vet att ett enda avslutande = i slutet av en rad är en fortsättning snarare än data. Där ett formtest inte kan skilja prosa från data avstår sidan och visar alternativet i stället för att välja åt användaren.
Vad den här sidan kör, och vad den vägrar köra
Tabellen nedan byggs av samma konstanter som sidan tillämpar, så en rad och en varning på den här sidan kan inte motsäga varandra. De två siffror som överraskar folk är raderna för Base58 och Base62: de två teknikerna konverteras med långdivision vars kostnad växer med kvadraten på längden, så den här sidan kör dem bara på en kort sträng och säger det i steget i stället för att verka hänga sig.
Uppskattningarna är medvetet pessimistiska. De kommer från en tidsmätningsrigg snarare än från den egna datorn, och en skrivbordswebbläsare är oftast flera gånger snabbare än den siffra som visas.
🔷 Kodningsverktyg
Rullar upp text som kodats mer än en gång, ett lager i taget.