Αποκωδικοποιητής αλυσίδας κωδικοποιήσεων

Κείμενο που έχει περάσει από περισσότερους από έναν κωδικοποιητή είναι η συνηθισμένη περίπτωση, όχι η εξωτική: ένα σώμα JSON μέσα σε ένα διακριτικό Base64, ένα URL μέσα σε γραμμή καταγραφής, μια τιμή φόρμας που διαφεύγει με ποσοστά και στη συνέχεια κωδικοποιείται σε Base64 ώστε να ταξιδέψει σε κεφαλίδα. Αυτή η σελίδα ξετυλίγει αυτά τα στρώματα ένα κάθε φορά, ονομάζει την τεχνική που χρησιμοποίησε σε κάθε βήμα, εμφανίζει πόσο βέβαιη είναι και γιατί, και καταγράφει τις τεχνικές που απέρριψε σε εκείνο το βήμα, ώστε να μπορεί κανείς να διαφωνήσει μαζί της. Σταματά όταν το κείμενο παύει να μοιάζει κωδικοποιημένο, όταν φτάνει το όριο βημάτων, ή όταν το επόμενο βήμα θα επανέφερε κείμενο που έχει ήδη εμφανιστεί. Τίποτα δεν μαντεύεται σιωπηλά: μια τεχνική της οποίας το αλφάβητο επικαλύπτεται με συνηθισμένες λέξεις δεν εφαρμόζεται ποτέ μόνη της, προσφέρεται μόνο.
Όλη η επεξεργασία γίνεται τοπικά στο πρόγραμμα περιήγησης — τα δεδομένα δεν μεταφορτώνονται ποτέ σε κανέναν διακομιστή.

Νέο σε αυτό; Οι αλυσίδες κωδικοποίησης εξηγούνται με απλά λόγια — τι είναι ένα στρώμα, γιατί η κωδικοποίηση δεν είναι κρυπτογράφηση και γιατί έχει σημασία η σειρά των βημάτων.
Εφαρμογή ενός στρώματος μόνο του όταν η βεβαιότητα είναι τουλάχιστον:
Σταμάτημα μετά
Εκτελεί το όριο στρωμάτων παραπάνω με ένα βήμα. Ο ίδιος πίνακας χτίζεται με τους δύο τρόπους, οπότε είναι δυνατή η μετάβαση σε βήμα προς βήμα ανά πάσα στιγμή.
Ή επιλογή τεχνικής με το χέρι:
Αυτή η λίστα είναι ό,τι βλέπει η σελίδα στο κείμενο αυτή τη στιγμή. Οι κρυπτογραφίες περιστροφής είναι πάντα μέσα, επειδή δεν ανιχνεύονται καθόλου· μέσα είναι και ό,τι γίνεται αναγνωρίσιμο μόνο όταν αφαιρεθούν τα κενά από ένα τυλιγμένο κείμενο, το οποίο σημαίνεται ως τέτοιο και δεν εφαρμόζεται ποτέ μόνο του.
Αυτή η είσοδος είναι μεγαλύτερη από όσο συνηθίζει αυτή η σελίδα να τρέχει χωρίς ερώτηση, και η παραπάνω εκτίμηση λέει ότι μπορεί να διαρκέσει . Κλικ στο Ξετύλιγμα ολόκληρης της αλυσίδας ξανά για να προχωρήσει όπως και να έχει, ή με πρώτη σμίκρυνση του κειμένου.
(πληκτρολόγηση ή επικόλληση κάτι πρώτα)
(η αλυσίδα θα εμφανιστεί εδώ)
Τι είναι μια αλυσίδα κωδικοποίησης, και γιατί χρειάζεται δικό της αποκωδικοποιητή;

Ένα στρώμα είναι μία κωδικοποίηση που εφαρμόζεται σε κείμενο. Μια αλυσίδα είναι δύο ή περισσότερες, εφαρμοσμένες η μία μετά την άλλη. Σχεδόν κάθε καθημερινό παράδειγμα μοιάζει έτσι: κάποιος χρειάζεται να βάλει ένα κομμάτι δυαδικού — μια εικόνα, ένα υπογεγραμμένο διακριτικό — σε μέρος που μεταφέρει μόνο κείμενο, οπότε το κάνει Base64. Αυτό το αποτέλεσμα Base64 πρέπει μετά να ταξιδέψει σε URL, οπότε διαφεύγει με ποσοστά. Ολόκληρο αυτό το URL μπαίνει σε γραμμή καταγραφής ή αρχείο ρυθμίσεων, οπότε και οι κάθετες ή τα εισαγωγικά διαφεύγουν. Αυτό που εμφανίζεται όταν παρουσιάζεται το πρόβλημα είναι το εξωτερικότερο στρώμα, και είναι μη αναγνώσιμο για τον απλό λόγο ότι τα εσωτερικά στρώματα εξακολουθούν να υπάρχουν.

Οι αποκωδικοποιητές ενός σκοπού δεν βοηθούν εδώ. Ένας αποκωδικοποιητής Base64 που θα λάβει το JTI2bHQlM0JiJTI2Z3QlM0JoaSUyNmx0JTNCJTJGYiUyNmd0JTNC θα δώσει μια απολύτως σωστή απάντηση που παραμένει μη αναγνώσιμη, επειδή οι διαφυγές ποσοστού και οι αναφορές χαρακτήρων βρίσκονται ακόμη πάνω από το επιθυμητό κείμενο. Αυτό που πραγματικά χρειάζεται είναι κάτι που αποφασίζει, σε κάθε βήμα, ποια κωδικοποίηση να αφαιρέσει· και αυτή η σελίδα είναι αυτή η απόφαση, ορατή.

Η κωδικοποίηση δεν είναι κρυπτογράφηση, και αυτή η σελίδα δεν σπάει τίποτα. Κάθε τεχνική εδώ είναι δημόσιος, αναστρέψιμος τρόπος να γραφτεί η ίδια πληροφορία. Το Base64 δεν έχει κλειδί. Η διαφυγή ποσοστού δεν έχει κλειδί. Αν το πιο εσωτερικό στρώμα είναι κρυπτογραφημένο, η σελίδα θα αποκωδικοποιήσει τα εξωτερικά στρώματα και θα δώσει κρυπτοκείμενο, το οποίο θα το πει καθαρά αντί να το παριστάνει ως αποτέλεσμα. Δεν υπάρχει τίποτα εδώ προς εκτέλεση και τίποτα προς απόκρυψη.
Τα εργασμένα παραδείγματα αυτής της σελίδας

Κάθε γραμμή παρακάτω είναι πραγματική είσοδος από το αρχείο δεδομένων αυτής της σελίδας, και η μεσαία στήλη είναι αυτό που βρίσκει ο δικός της αποκωδικοποιητής σε αυτήν. Η τελευταία στήλη είναι το κείμενο που μένει όταν σταματά.

Τι είναι η είσοδος Στρώματα που βρέθηκαν Είσοδος, όπως έρχεται Ό,τι μένει όταν σταματά

Αυτές οι γραμμές αποδίδονται από τη σελίδα από τον δικό της πίνακα περιπτώσεων και εκτελούνται ξανά σε κάθε επίσκεψη, οπότε δεν μπορούν να αποκλίνουν από το τι κάνει ο κώδικας. Το αυτοτέστ παρακάτω ελέγχει το καθένα.

Πώς αποφασίζει η σελίδα ποιο στρώμα να αφαιρέσει
  1. Κοιτάζοντας το σχήμα, όχι το νόημα. Κάθε τεχνική έχει υπογραφή — μια διαφυγή ποσοστού, ένα άρτιο πλήθος δεκαεξαδικών ψηφίων, ένα αλφάβητο και μήκος που ταιριάζουν στο Base64. Η σελίδα καταγράφει κάθε τεχνική της οποίας η υπογραφή ταιριάζει με το κείμενο, με βεβαιότητα μεταξύ 0 και 1.
  2. Αποκωδικοποίηση, και έπειτα έλεγχος αν το αποτέλεσμα είναι κείμενο. Μια τεχνική αξίζει να εφαρμοστεί μόνο αν παράγει κάτι αναγνώσιμο. Κάθε υποψήφιο εκτελείται πραγματικά, και η έξοδός του βαθμολογείται με βάση το πόσο της είναι εκτυπώσιμοι χαρακτήρες.
  3. Εφαρμογή μόνο εκείνων που περνούν το όριο, με σειρά βεβαιότητας. Εφαρμόζεται ο υποψήφιος με τη μεγαλύτερη βεβαιότητα πάνω από το κατώφλι, και η διαδικασία επαναλαμβάνεται στο αποτέλεσμα. Κάτω από το κατώφλι, οι τεχνικές καταγράφονται αλλά δεν εφαρμόζονται.
  4. Ένας κανόνας που προσθέτει αυτή η σελίδα πάνω απ' όλα. Ακόμη και όταν μια τεχνική περνά το κατώφλι, αυτή η σελίδα δεν την εφαρμόζει μόνη της παρά μόνο αν το αποτέλεσμα είναι πραγματικά αναγνώσιμο κείμενο — οι χαρακτήρες αντικατάστασης και οι χαρακτήρες ελέγχου μετρούν εναντίον του. Χωρίς τον κανόνα αυτό, η συνηθισμένη λέξη cafe θα αποκωδικοποιούνταν έγκυρα ως τρία byte που είναι εκτυπώσιμα μόνο σε Latin-1, και το getUserName ως οκτώ byte θορύβου. Ο ανιχνευτής έχει δίκιο ότι αυτές οι συμβολοσειρές ταιριάζουν στο αλφάβητο· αυτή η σελίδα αποφασίζει ότι το να ταιριάζουν στο αλφάβητο δεν αρκεί. Είναι ακόμη δυνατό να εφαρμοστούν χειροκίνητα, και η λίστα υποψηφίων λέει ότι αρνήθηκε και γιατί.
  5. Σταμάτημα, σκόπιμα. Όταν καμία τεχνική δεν περνά το όριο, όταν το κείμενο παύει να αλλάζει, όταν φτάνει το όριο βημάτων, ή όταν το επόμενο βήμα θα επανέφερε κείμενο που έχει ήδη εμφανιστεί σε αυτή την αλυσίδα. Το τελευταίο έχει σημασία: το ROT13 είναι το δικό του αντίστροφο, οπότε μια αλυσίδα που θα επέτρεπε να πάρει αυτό το βήμα δύο φορές δεν θα τελείωνε ποτέ.
  6. Ένα τυλιγμένο κείμενο προσφέρεται, δεν εφαρμόζεται ποτέ. Αν το κείμενο είναι κομμένο σε πολλές γραμμές, ο ανιχνευτής βλέπει κενά, διαβάζει συνηθισμένη πεζογραφία και δεν βρίσκει τίποτα. Έτσι η σελίδα αφαιρεί τα κενά από ένα αντίγραφο του κειμένου, ξαναρωτά τον ανιχνευτή και προσφέρει ό,τι βρει ως βήμα προς επιλογή με το χέρι. Η αφαίρεση κενών από ένα κείμενο είναι ξαναγράψιμο του κειμένου, και αυτή η σελίδα δεν ξαναγράφει τίποτα χωρίς ρητό αίτημα.
Τι δεν κάνει αυτή η σελίδα
Αποκωδικοποιεί, και τίποτα άλλο. Το κείμενο που επικολλάται δεν εκτελείται ποτέ: ούτε eval, ούτε new Function, ούτε έγχυση σεναρίου, ούτε άνοιγμα εγγράφου. Δεν στέλνεται ποτέ πουθενά: ούτε μεταφόρτωση, ούτε αίτημα, ούτε αναλυτικά. Εκτός από τη θέση διαφήμισης στο κάτω μέρος της σελίδας και τη σειρά κουμπιών κοινοποίησης (είναι τα μόνα δύο στοιχεία τρίτων που φορτώνει αυτή η σελίδα), δεν φορτώνεται γραμματοσειρά ή σενάριο από άλλο διακομιστή. Η αποκωδικοποιημένη έξοδος γράφεται στη σελίδα ως κείμενο, οπότε μια ετικέτα HTML που βγαίνει από ένα στρώμα εμφανίζεται ως ετικέτα και δεν μετατρέπεται σε ετικέτα. Η επαλήθευση γίνεται με πάτημα του Αυτοέλεγχος, που ελέγχει τον ίδιο τον πηγαίο κώδικα της σελίδας για οποιαδήποτε από αυτές τις κατασκευές, και αποτυγχάνει αν βρει κάποια.
Τι μπορεί να αναγνωρίσει, και τι όχι
Τεχνική Πόσο σίγουρο, μόνο του Η παγίδα

Το κείμενο που παρατίθεται σε αυτή τη σελίδα είναι γραμμένο για αυτόν τον ιστότοπο. Τα αλφάβητα Base64, Base32, Base58, Base91 και quoted-printable και η μορφή μπλοκ uuencode είναι τα δημοσιευμένα· η αποκωδικοποίηση ακολουθεί αυτούς τους ορισμούς και όχι τις ιδιαιτερότητες κάποιου συγκεκριμένου εργαλείου. Τα διανύσματα αναφοράς των αλφαβήτων βρίσκονται στις αδελφές σελίδες, που φέρουν τα διανύσματα δοκιμής RFC 4648.

Κείμενο που έρχεται τυλιγμένο σε πολλές γραμμές

Ένα blob που έχει περάσει από μήνυμα email, αρχείο PEM, διακριτικό σε κεφαλίδα ή hash που αντιγράφηκε από τερματικό είναι συνήθως τυλιγμένο: ο κωδικοποιητής το έσπασε σε σταθερή στήλη — 76 χαρακτήρες είναι η σύμβαση MIME — και έβαλε αλλαγή γραμμής εκεί που τελείωσε η στήλη. Αυτές οι αλλαγές γραμμής δεν είναι μέρος των δεδομένων. Υπάρχουν ώστε μια μακριά γραμμή να επιβιώνει στη μεταφορά, και κάθε αποκωδικοποιητής που διαβάζει ένα τέτοιο blob αναμένεται να τις αγνοεί.

Αυτή η σελίδα δεν τις αγνοεί από μόνη της, και ο λόγος είναι ο κανόνας που χρησιμοποιεί παντού αλλού. Τα κενά είναι το ισχυρότερο μεμονωμένο σημάδι ότι μια συμβολοσειρά είναι πεζογραφία και όχι δεδομένα, και αυτό είναι το τεστ που εμποδίζει το The quick brown fox jumps over the lazy dog. να διαβαστεί ως οτιδήποτε. Ένα τυλιγμένο blob μοιάζει ακριβώς με πεζογραφία σε αυτό το τεστ, οπότε η σελίδα δεν βρίσκει τίποτα σε αυτό· και στη συνέχεια κάνει το τίμιο μισό της δουλειάς: υπολογίζει τι θα έβρισκε αν αφαιρούνταν τα κενά, το καταγράφει στον χειροκίνητο επιλογέα με σήμανση πρώτα τα κενά έξω, και εκεί σταματά. Προσφέρεται αντί να εφαρμόζεται, επειδή η αφαίρεση κενών αλλάζει το κείμενο, και αυτή η σελίδα αλλάζει κείμενο μόνο όταν μπορεί να αποδείξει ποια είναι η αλλαγή. Εδώ μπορεί να αποδείξει ποια είναι η αλλαγή, και παρόλα αυτά αρνείται να την κάνει για λογαριασμό του χρήστη, επειδή ένα κείμενο με αλλαγή γραμμής στη μέση μιας τιμής και ένα κείμενο με αλλαγή γραμμής ανάμεσα σε δύο πεδία φαίνονται ίδια από μέσα.

Τα δύο βήματα όταν η σελίδα σταματά σε κείμενο τυλιγμένο. Μετάβαση στο Βήμα προς βήμα με το χέρι, πάτημα του Εφαρμογή του επόμενου στρώματος μία φορά (αυτό δίνει στη σελίδα αλυσίδα για να προσθέσει, και δεν αλλάζει τίποτα), και στη συνέχεια επιλογή της καταχώρισης με σήμανση πρώτα τα κενά έξω και πάτημα του Εφαρμογή. Η γραμμή που βγαίνει λέει πόσοι χαρακτήρες κενού αφαιρέθηκαν, και αναφέρει το μέγεθος εισόδου της ως το κείμενο που επικολλήθηκε, οπότε η διαφορά ανάμεσα στα δύο μεγέθη σε εκείνη τη γραμμή είναι ακριβώς τα κενά που βγήκαν.

Ο ίδιος συλλογισμός καλύπτει και τις περιπτώσεις που πάνε αντίστροφα. Ένα μπλοκ uuencode φέρει γραμμή begin και έναν χαρακτήρα μήκους σε κάθε γραμμή, οπότε αναγνωρίζεται ως έχει και εφαρμόζεται μόνο του· ένα σώμα quoted-printable κρατά τις δικές του μαλακές αλλαγές γραμμής και αποκωδικοποιείται από τον δικό του αποκωδικοποιητή, ο οποίος ξέρει ότι ένα μόνο τελικό = στο τέλος γραμμής είναι συνέχεια και όχι δεδομένο. Όπου ένα τεστ σχήματος δεν μπορεί να ξεχωρίσει πεζογραφία από δεδομένα, η σελίδα αρνείται και δείχνει την εναλλακτική αντί να επιλέξει για τον χρήστη.

Τι θα εκτελέσει αυτή η σελίδα, και τι αρνείται

Ο πίνακας παρακάτω χτίζεται από τις ίδιες σταθερές που επιβάλλει η σελίδα, οπότε μια γραμμή και μια προειδοποίηση σε αυτή τη σελίδα δεν μπορούν να διαφωνήσουν. Τα δύο νούμερα που εκπλήσσουν τους περισσότερους είναι οι γραμμές Base58 και Base62: αυτές οι δύο τεχνικές μετατρέπονται με μακρά διαίρεση της οποίας το κόστος αυξάνεται με το τετράγωνο του μήκους, οπότε η σελίδα τις τρέχει μόνο σε σύντομη συμβολοσειρά και το λέει στο βήμα αντί να φαίνεται ότι κολλά.

Οι εκτιμήσεις είναι σκόπιμα απαισιόδοξες. Προέρχονται από αρμό χρονομέτρησης και όχι από έναν συνηθισμένο υπολογιστή επιτραπέζιου· ένα πρόγραμμα περιήγησης σε επιτραπέζιο συνήθως είναι αρκετές φορές ταχύτερο από τον αριθμό που εμφανίζεται.