Base64를 UTF-16으로 디코딩하는 방법
- 입력 · Base64에 Base64를 붙여넣으세요. 문자 인코딩은 UTF-16LE로 미리 설정되어 있습니다.
- 출력 · 텍스트에서 텍스트를 읽으세요. 감지기는 0 바이트를 바이너리 데이터의 신호로 보기 때문에 추정 형식 항목은 대개 바이너리라고 표시하지만, 텍스트 출력은 정상입니다.
- 결과가 한자 같은 CJK 문자의 나열이라면 문자 인코딩을 UTF-16BE로 바꾸세요.
- 데이터가 바이트 순서 표시로 시작하면 자동 감지가 알맞은 바이트 순서를 고르고 표시를 제거합니다.
- 출력 복사는 텍스트를 복사하고, 다운로드는 원본 바이트를 저장합니다.
반대 방향은 UTF-16을 Base64로를 참고하세요.
Base64 속 UTF-16 알아보기
UTF-16 Base64에는 눈에 보이는 리듬이 있습니다. UTF-16의 ASCII 텍스트는 글자 바이트와 0 바이트가 번갈아 나오고, 0 비트는 Base64 알파벳에서 A에 대응하므로 몇 글자마다 A가 나타납니다.
| Base64 | 바이트 순서 | 디코딩 결과 |
|---|---|---|
SABlAGwAbABvAA== | LE, BOM 없음 | Hello |
AEgAZQBsAGwAbw== | BE, BOM 없음 | Hello |
//5IAGkA | LE, BOM FF FE | Hi |
/v8ASABp | BE, BOM FE FF | Hi |
RwBlAHQALQBEAGEAdABlAA== | LE, BOM 없음 | Get-Date |
빅 엔디언 ASCII 텍스트는 첫 바이트가 0이므로 항상 A로 시작합니다. //4나 /v8로 시작하는 문자열은 바이트 순서 표시로 시작합니다.
바이트 순서, BOM, 자동 감지
바이트 순서를 잘못 고르면 모든 바이트 쌍이 뒤바뀌어 영어가 한자로 바뀝니다. AEgAZQBsAGwAbw==를 UTF-16LE로 디코딩하면 䠀攀氀氀漀가 나옵니다. 잃어버린 데이터는 없으며, 문자 인코딩만 바꾸면 해결됩니다.
자동 감지는 데이터가 BOM으로 시작할 때 UTF-16을 확실하게 처리합니다. BOM이 없으면 UTF-16으로 된 순수 ASCII 텍스트가 올바른 UTF-8이기도 해서(UTF-8에서도 0 바이트는 허용됨), 자동 감지가 보이지 않는 문자가 섞인 UTF-8로 착각할 수 있습니다. 이 페이지에서는 시작 부분에 //4나 /v8가 보이지 않는 한 UTF-16LE나 UTF-16BE를 직접 선택해 두세요.
바이트 수가 홀수라면 뭔가 잘못된 것입니다. SABpAAA=에는 5바이트가 들어 있고, UTF-16LE로 디코딩하면 Hi 뒤에 �가 붙습니다. 값이 잘렸거나 처음부터 UTF-16이 아닌 경우입니다.
UTF-16 Base64는 어디서 오나
가장 흔한 출처는 PowerShell입니다. powershell -enc SQBFAFgA... 같은 인코딩된 명령은 예약된 작업, 설치 스크립트, 보안 로그에 등장하며, 이 Base64는 항상 UTF-16LE입니다. PowerShell EncodedCommand 디코더는 전체 명령줄에서 값을 뽑아내고 스크립트 안의 Base64도 찾아봅니다.
그 밖에 Convert.ToBase64String(Encoding.Unicode.GetBytes(...))를 호출하는 .NET 프로그램, Windows 레지스트리와 이벤트 데이터, 바이너리로 내보낸 SQL Server NVARCHAR 값도 출처가 됩니다.
코드에서 UTF-16 Base64 디코딩하기
import base64
raw = base64.b64decode("SABlAGwAbABvAA==")
raw.decode("utf-16-le") # 'Hello'
base64.b64decode("/v8ASABp").decode("utf-16") # 'Hi', byte order taken from the BOM
바이트 수가 홀수이면 Python은 UnicodeDecodeError: truncated data를 발생시킵니다.
// Node.js: little-endian only
Buffer.from("SABlAGwAbABvAA==", "base64").toString("utf16le"); // "Hello"
// Browsers and Node.js: either order
new TextDecoder("utf-16be").decode(Uint8Array.from(atob("AEgAZQBsAGwAbw=="), c => c.charCodeAt(0))); // "Hello"
C#에서는 Encoding.Unicode.GetString(Convert.FromBase64String(s))가 UTF-16LE를 읽고, Encoding.BigEndianUnicode가 빅 엔디언을 읽습니다. Python과 Node.js도 참고하세요.
자주 묻는 질문
Base64에 UTF-16이 들어 있는지 어떻게 알 수 있나요?
SABlAGwAbABvAA==처럼 A가 일정한 간격으로 많이 나오는지 보세요. UTF-16에서는 ASCII 글자마다 0 바이트가 하나씩 붙기 때문입니다. //4나 /v8로 시작하면 UTF-16 바이트 순서 표시(BOM)입니다.
디코딩하면 한자가 나오는 이유는 무엇인가요?
바이트 순서가 뒤집혔기 때문입니다. 빅 엔디언 Hello를 리틀 엔디언으로 읽으면 䠀攀氀氀漀가 됩니다. 문자 인코딩을 UTF-16LE와 UTF-16BE 사이에서 바꾸세요.
텍스트 끝에 �가 붙는 이유는 무엇인가요?
UTF-16은 바이트 수가 짝수여야 합니다. 홀수라면 Base64가 잘렸거나 애초에 UTF-16이 아니며, 남은 바이트 하나가 대체 문자로 바뀝니다.
PowerShell -EncodedCommand는 어떻게 디코딩하나요?
-EncodedCommand(또는 -enc) 뒤의 값은 UTF-16LE Base64이므로 이 페이지에서 디코딩할 수 있습니다. PowerShell 디코더는 명령줄 전체도 받아 주고 중첩된 페이로드도 찾아냅니다.