둘 이상의 인코더를 거친 텍스트는 특수한 경우가 아니라 보통 경우입니다. Base64 토큰 안의 JSON 본문, 로그 줄 안의 URL, 헤더에 실으려고 퍼센트 이스케이프 후 다시 Base64된 폼 값. 이 페이지는 그 겹들을 한 번에 하나씩 풀고, 각 단계에서 쓴 기법의 이름을 대고, 확신도와 이유를 인쇄하고, 그 단계에서 거부한 기법들을 나열해 당신이 이견을 낼 수 있게 합니다. 텍스트가 인코딩처럼 보이지 않게 되거나, 단계 한도에 도달하거나, 다음 단계가 이미 본 텍스트를 되돌려올 때 멈춥니다. 아무것도 조용히 추측하지 않습니다. 알파벳이 평범한 단어와 겹치는 기법은 스스로 적용하지 않고 제안만 합니다. 모든 처리는 브라우저에서 로컬로 이루어집니다 — 데이터는 어떤 서버에도 업로드되지 않습니다.
처음이신가요?쉬운 말로 푼 인코딩 체인 설명 — 겹이란 무엇인지, 인코딩이 암호화가 아닌 이유, 단계 순서가 중요한 이유.
확신도가 최소한 이 값일 때만 스스로 겹을 적용:
여기서 멈춤
위 겹 한도를 한 번에 실행합니다. 어느 쪽이든 같은 표가 만들어지므로 언제든 수동 전환할 수 있습니다.
또는 기법을 직접 고르세요:
이 목록은 페이지가 지금 텍스트에서 볼 수 있는 것입니다. 회전 암호는 전혀 감지할 수 없어 항상 들어 있고, 접힌 텍스트에서 공백을 제거해야만 인식되는 것도 들어 있습니다(그렇게 표시되며 스스로 적용되지 않습니다).
인코딩된 텍스트
이 입력은 이 페이지가 묻지 않고 실행하기에 긴 편이며, 위 추정치로는 걸릴 수 있습니다. 그래도 진행하려면 체인 전체 풀기를 다시 누르거나, 먼저 텍스트를 줄이세요.
페이지가 지금 텍스트에서 보는 것
(먼저 뭔가를 입력하거나 붙여넣으세요)
(체인이 여기에 나타납니다)
벗겨진 순서대로 겹
#
기법
확신도
입력 → 결과
크기
이것을 고른 이유
겹당
복사는 그 겹이 벗겨진 직후의 텍스트를 가져옵니다. 되돌리기는 그 겹과 그 위의 모든 겹을 버립니다. 한 번에 두 단계 이상을 취소하는 방법입니다.
이후 결과0겹(아직 없음)
인코딩 체인이란 무엇이고 왜 전용 디코더가 필요한가?
겹은 텍스트에 적용된 인코더 하나입니다. 체인은 둘 이상이 차례로 적용된 것입니다. 일상적인 예는 거의 다 이렇게 생겼습니다. 누군가 바이너리 조각 — 이미지, 서명된 토큰 — 을 텍스트만 실을 수 있는 곳에 넣어야 해서 Base64를 씁니다. 그 Base64 결과가 URL을 여행해야 하니 퍼센트 이스케이프가 붙습니다. 그 URL 전체가 로그 줄이나 설정 파일에 들어가니 백슬래시나 따옴표도 이스케이프됩니다. 문제를 만났을 때 보고 있는 것은 가장 바깥 겹이며, 안쪽 겹이 아직 덮여 있다는 단순한 이유로 읽을 수 없습니다.
단일 용도 디코더는 여기 도움이 안 됩니다. JTI2bHQlM0JiJTI2Z3QlM0JoaSUyNmx0JTNCJTJGYiUyNmd0JTNC를 받은 Base64 디코더는 완벽히 올라도 여전히 읽을 수 없는 답을 냅니다. 퍼센트 이스케이프와 문자 참조가 원하던 텍스트 위에 아직 있기 때문입니다. 실제로 필요한 것은 매 단계에서 어떤 인코더를 벗길지 결정하는 것입니다 — 이 페이지가 바로 그 결정을 보이게 만든 것입니다.
인코딩은 암호화가 아니며 이 페이지는 아무것도 깨지 않습니다. 이 페이지의 모든 기법은 같은 정보를 적어 두는 공개되고 되돌릴 수 있는 방법입니다. Base64에 키가 없습니다. 퍼센트 이스케이프에도 키가 없습니다. 가장 안쪽 겹이 암호화되어 있다면 이 페이지는 바깥 겹을 풀고 암호문을 건네며, 결과인 척하지 않고 그렇다고 분명히 말합니다. 실행할 것도 숨길 것도 없습니다.
이 페이지의 풀이 예제
아래 각 행은 이 페이지 데이터 파일의 실제 입력이고 가운데 열은 페이지 자신의 풀기 장치가 그 안에서 찾은 것입니다. 마지막 열은 멈췄을 때 남는 텍스트입니다.
입력의 정체
발견된 겹
도착한 그대로의 입력
멈췄을 때 남은 것
이 행들은 페이지가 자기 사례 목록에서 직접 렌더링하고 매 방문마다 다시 실행되므로 코드가 하는 일에서 멀어질 수 없습니다. 아래 자체 테스트가 하나하나 검사합니다.
페이지가 어떤 겹을 벗길지 정하는 법
의미가 아니라 모양을 보세요. 각 기법에는 서명이 있습니다 — 퍼센트 이스케이프, 짝수 길이의 hex 자릿수, Base64에 맞는 알파벳과 길이. 페이지는 서명이 텍스트와 일치하는 모든 기법을 0과 1 사이의 확신도와 함께 나열합니다.
디코딩한 뒤 결과가 텍스트인지 검사하세요. 기법은 읽을 수 있는 것을 만들어낼 때만 적용할 가치가 있습니다. 모든 후보가 실제로 실행되고 출력이 인쇄 가능 문자 비율로 점수 매겨집니다.
기준을 넘는 것만, 확신도 순서로 적용하세요. 임계값을 넘는 최고 확신도 후보가 적용되고 결과에 대해 과정이 반복됩니다. 임계값 아래는 나열만 되고 적용되지 않습니다.
이 페이지가 얹는 한 가지 규칙. 임계값을 넘어도 결과가 진짜 읽을 수 있는 텍스트가 아니면 스스로 적용하지 않습니다 — 치환 문자와 제어 문자가 감점입니다. 이 규칙이 없으면 평범한 단어 cafe가 Latin-1에서만 인쇄 가능한 3바이트로, getUserName이 잡음 8바이트로 올바르게 디코딩됩니다. 감지기가 그 문자열이 알파벳에 맞다고 한 것은 맞습니다. 이 페이지는 알파벳에 맞는 것만으로는 부족하다고 결정합니다. 직접 적용할 수는 있고 후보 목록이 거절했다고, 그 이유까지 알려줍니다.
의도적으로 멈춥니다. 어떤 기법도 기준을 넘지 못할 때, 텍스트가 더 변하지 않을 때, 단계 한도에 도달했을 때, 또는 다음 단계가 이 체인에서 이미 나타난 텍스트를 되돌려올 때. 마지막 것이 중요합니다. ROT13은 자기 자신의 역이라 그 단계를 두 번 밟도록 허용하면 체인이 끝나지 않습니다.
접힌 텍스트는 제안되지 적용되지 않습니다. 텍스트가 여러 줄로 잘려 있으면 감지기는 공백을 보고 평범한 산문으로 읽어 아무것도 못 찾습니다. 그래서 페이지는 텍스트 사본에서 공백을 빼고 감지기에게 다시 물어보고, 찾은 것을 직접 고르는 단계로 제안합니다. 당신 텍스트에서 공백을 빼는 것은 텍스트의 재작성이며, 이 페이지는 당신이 다시 써 달라고 하지 않은 것은 다시 쓰지 않습니다.
이 페이지가 하지 않는 것
디코딩만 하고 다른 것은 하지 않습니다. 붙여넣은 텍스트는 결코 실행되지 않습니다. eval도 new Function도, 스크립트 주입도, 문서 열기도 없습니다. 어디로도 전송되지 않습니다. 업로드, 요청, 분석 없음. 페이지 하단 광고 슬롯과 공유 버튼 행(이 페이지가 싣는 단 둘의 제3자 위젯)을 빼면 다른 호스트에서 가져오는 폰트나 스크립트가 없습니다. 디코딩된 출력은 텍스트로 페이지에 쓰이므로 겹에서 나온 HTML 태그는 태그로 만들어지는 대신 태그로 표시됩니다. 이것 전부를 검증할 수 있습니다. 자체 테스트를 누르면 이 페이지 자신의 소스에서 그런 구조물을 찾아 하나라도 발견하면 실패합니다.
인식하는 것과 못 하는 것
기법
단독 확신도
함정
이 페이지에 인용된 텍스트는 이 사이트를 위해 쓰였습니다. Base64, Base32, Base58, Base91, quoted-printable 알파벳과 uuencode 블록 형식은 공개된 것들이며, 디코딩은 특정 도구의 특성이 아니라 그 정의를 따릅니다. 알파벳의 참조 벡터는 RFC 4648 테스트 벡터를 실은 형제 페이지에 있습니다.
여러 줄로 접혀 도착한 텍스트
이메일 메시지, PEM 파일, 헤더의 토큰, 터미널에서 복사한 해시를 거친 덩어리는 보통 접혀 있습니다. 인코더가 고정 열에서 끊었습니다 — 76자가 MIME 관례입니다 — 그리고 열이 끝난 곳에 줄 바꿈을 넣었습니다. 그 줄 바꿈은 데이터의 일부가 아닙니다. 긴 줄이 전송을 survive하도록 존재하며, 그런 덩어리를 읽는 모든 디코더가 그것을 무시하기로 되어 있습니다.
이 페이지는 스스로 무시하지 않으며, 이유는 다른 모든 곳에서 쓰는 규칙과 같습니다. 공백은 문자열이 데이터가 아니라 산문이라는 가장 강한 단일 신호이며, 그것이 The quick brown fox jumps over the lazy dog.을 아무것도 아닌 것으로 읽히지 않게 하는 시험입니다. 접힌 덩어리는 그 시험에 산문으로 보이므로 페이지는 아무것도 못 찾고 — 그다음 정직하게 절반의 일을 합니다. 공백을 뺐다면 무엇을 찾을지 계산해 공백 제거 먼저 표시와 함께 수동 선택 목록에 넣고 거기서 멈춥니다. 적용이 아니라 나열인 이유는 공백 제거가 입력 텍스트를 바꾸기 때문이며, 이 페이지는 바꿈이 무엇인지 증명할 수 있을 때만 텍스트를 바꿉니다. 여기서는 증명할 수 있는데도 당신 대신 실행하지 않습니다. 값 한가운데의 줄 바꿈과 두 필드 사이의 줄 바꿈이 안에서는 같게 보이기 때문입니다.
접힌 텍스트에서 멈췄을 때의 두 단계.직접 한 겹씩으로 전환하고 다음 겹 적용을 한 번 누르세요(그것이 페이지에 추가할 체인을 주며 아무것도 바꾸지 않습니다). 그다음 공백 제거 먼저 표시가 붙은 항목을 골라 적용을 누르세요. 벗겨진 행은 제거된 공백 문자 수를 말하고 입력 크기를 붙여넣은 텍스트로 보고하므로, 그 행의 두 수의 차이가 정확히 나온 공백입니다.
같은 추론이 반대 방향 사례를 덮습니다. uuencode 블록은 begin 줄과 매 줄의 길이 문자를 싣고 있어 있는 그대로 인식되어 스스로 적용됩니다. quoted-printable 본문은 자기 자신의 소프트 줄 바꿈을 유지하며 자기 디코더로 풀립니다. 그 디코더는 줄 끝의 단일 =이 데이터가 아니라 이어짐임을 압니다. 모양 시험이 산문과 데이터를 구별할 수 없는 곳에서 페이지는 거절하고 당신 대신 고르는 대신 대안을 보여줍니다.
이 페이지가 실행하는 것과 거부하는 것
아래 표는 페이지가 강제하는 것과 같은 상수로 만들어져 이 페이지의 행과 경고가 어긋날 수 없습니다. 사람을 놀라게 하는 두 수치는 Base58과 Base62 행입니다. 그 두 기법은 비용이 길이의 제곱으로 자라는 긴 나눗셈으로 변환되므로 이 페이지는 짧은 문자열에서만 돌리고, 멈춘 것처럼 보이는 대신 그렇다고 단계에서 말합니다.
추정치는 일부러 비관적입니다. 당신의 기계가 아니라 계측 장치에서 왔으며 데스크톱 브라우저는 보통 표시된 수치보다 몇 배 빠릅니다.