Base32 변환 방법, 5비트 그룹화와 패딩 원리

Base32로 바뀐 문자열 끝에 등호(=)가 여러 개 붙어 있거나, 반대로 하나도 없어서 이유가 궁금하다면 이 글이 그 답입니다.
Base32는 데이터를 5비트씩 묶어 정해진 32개 문자로 바꾸는 규칙일 뿐이라, 입력 길이만 알면 결과 길이와 등호 개수를 계산으로 미리 알 수 있습니다. 이 글은 그 규칙을 손으로 따라 할 수 있을 만큼 구체적으로 설명합니다.
요약 ① Base32는 데이터를 5비트씩 묶어 A-Z와 2-7로 이뤄진 32개 문자로 바꾸는 인코딩입니다. ② 결과 길이가 8의 배수가 되도록 남는 자리를 등호(=)로 채웁니다. ③ 디코드할 때 A-Z, 2-7 이외의 문자가 섞여 있으면 "올바른 Base32 형식이 아닙니다" 오류가 뜹니다.
왜 이 질문이 생기는가: Base32를 실제로 마주치는 상황
Base32 문자열을 가장 자주 마주치는 곳은 OTP(일회용 비밀번호) 앱의 "수동 입력" 화면입니다. 서비스가 QR코드 대신 대문자와 숫자로 된 문자열 하나를 보여주며, 이 키를 인증 앱에 직접 입력하라고 안내합니다.
이 문자열을 자세히 보면 숫자는 2부터 7까지만 나오고 0, 1, 8, 9는 한 번도 등장하지 않습니다. 어떤 문자열은 끝에 등호가 없고, 어떤 문자열은 여러 개 붙어 있기도 합니다. 규칙을 모르면 오타로 착각하기 쉽습니다.
이런 문자열을 옮겨 적다가 디코더에 넣었는데 "올바른 형식이 아니다"라는 오류를 만나는 경우도 흔합니다. 왜 특정 문자만 허용되고, 등호가 왜 필요한지를 알면 이런 상황에서 오타인지 원래 그런 것인지 스스로 판단할 수 있습니다.
도구 없이 손으로 계산하는 방법
Base32 인코딩은 네 단계로 이뤄집니다. 순서대로 따라 하면 도구 없이도 결과를 직접 만들 수 있습니다.
인코딩 네 단계
- 텍스트를 바이트로 바꿉니다. 문자열을 UTF-8로 인코딩하면 문자마다 바이트 값이 나옵니다. 예를 들어 소문자 h는 0x68(2진수 01101000), i는 0x69(2진수 01101001)입니다.
- 모든 바이트의 비트를 한 줄로 이어 붙입니다. "hi"라면 01101000과 01101001을 이어 붙여 0110100001101001, 총 16비트가 됩니다.
- 앞에서부터 5비트씩 끊습니다. 16비트를 5비트씩 나누면 01101, 00001, 10100, 1이 남는데, 마지막 조각은 1비트뿐이므로 뒤에 0을 채워 5비트(10000)로 맞춥니다.
- 각 5비트 값을 알파벳에서 순번(0부터 시작)의 문자로 바꿉니다. "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"에서 01101(13)은 N, 00001(1)은 B, 10100(20)은 U, 10000(16)은 Q입니다. 그래서 "hi"는 "NBUQ"가 됩니다.
등호 채우기와 디코딩 확인
여기까지가 실제 데이터를 담은 부분입니다. 마지막으로 전체 길이를 8자의 배수로 맞추기 위해 등호를 채웁니다. "NBUQ"는 4자이므로 8자가 되도록 등호 4개를 뒤에 붙여 최종 결과는 "NBUQ===="가 됩니다.
디코딩은 반대 순서입니다. "NBUQ===="에서 등호를 떼어내고 남은 "NBUQ" 네 글자를 다시 5비트 숫자로 되돌려 이어 붙이면 20비트가 나오는데, 원래 바이트 수(2바이트=16비트)만큼만 앞에서 잘라 쓰고 나머지 4비트는 버립니다.
남은 16비트를 8비트씩 나누면 정확히 h와 i의 바이트 값으로 되돌아옵니다.
저희 도구로 확인하기.
텍스트 Base32 인코딩·디코딩을 브라우저에서 바로 계산합니다. 가입 없이 무료이며 입력값은 서버로 전송되지 않습니다.

헷갈리기 쉬운 지점
Base32 알파벳에는 아라비아 숫자 0, 1, 8, 9가 빠져 있습니다. 대문자 O·I·L·B와 헷갈리기 쉬운 숫자를 제외해 손으로 옮겨 적을 때 오독을 줄이려는 설계로 흔히 설명됩니다. 그래서 Base32 문자열에 0이나 1이 보인다면 그 자체로 Base32가 아니거나 오타일 가능성이 큽니다.
디코드 오류가 뜨는 이유
디코드 모드는 입력에서 공백과 등호를 먼저 제거하고 소문자를 대문자로 바꾼 뒤 해석합니다. 그래서 등호를 빼먹거나 소문자로 입력해도 정상적으로 디코딩됩니다.
다만 A-Z, 2-7 범위를 벗어난 문자가 하나라도 남아 있으면 그 시점에 "Invalid Base32 character" 오류가 발생하고, 화면에는 "올바른 Base32 형식이 아닙니다"로 표시됩니다.
Base32와 Base64의 차이
Base32는 같은 목적을 가진 Base64와 자주 비교됩니다. 둘의 차이는 아래와 같습니다.
| 구분 | Base32 | Base64 |
|---|---|---|
| 묶는 비트 단위 | 5비트 | 6비트 |
| 알파벳 크기 | 32개 (A-Z, 2-7) | 64개 (A-Z, a-z, 0-9, +, /) |
| 대소문자 구분 | 없음 (결과는 항상 대문자) | 있음 |
| 결과 길이 정렬 기준 | 8자의 배수 | 4자의 배수 |
| 원본 대비 결과 길이 | 약 1.6배 | 약 1.33배 |
등호 개수는 원본 바이트 수를 5로 나눈 나머지로 정해집니다. 나머지가 1바이트면 등호 6개, 2바이트면 4개, 3바이트면 3개, 4바이트면 1개가 붙고, 5바이트 단위로 나머지 없이 딱 떨어지면 등호가 아예 붙지 않습니다.
정리
- Base32는 데이터를 5비트씩 묶어 A-Z, 2-7로 이뤄진 32개 문자로 표현하는 인코딩입니다.
- 결과 길이가 8자의 배수가 되도록 남는 자리를 등호(=)로 채우며, 등호 개수는 원본 바이트 수를 5로 나눈 나머지에 따라 기계적으로 정해집니다.
- Base64보다 알파벳 수가 적어 같은 데이터라도 결과 문자열이 더 길어지고(약 1.6배), 결과가 항상 대문자라는 점에서 Base64와 다릅니다.
- 디코드 오류는 A-Z, 2-7 이외의 문자, 대표적으로 0, 1, 8, 9나 Base64 전용 기호 +, /가 섞여 있을 때 발생합니다.
- 모든 계산은 브라우저 안에서 즉시 이뤄지며 입력한 텍스트는 서버로 전송되지 않습니다.
텍스트 Base32 인코딩·디코딩을 브라우저에서 바로 계산합니다. 가입 없이 무료이며 입력값은 서버로 전송되지 않습니다.
자주 묻는 질문
Base32와 Base64는 무엇이 다른가요?
Base32는 A-Z와 2-7만 사용하는 대소문자 구분 없는 인코딩이고, Base64는 A-Z·a-z·0-9와 +, /까지 사용하는 대소문자 구분 인코딩입니다. 알파벳 수가 적은 만큼 같은 데이터를 인코딩해도 Base32 결과 문자열이 Base64보다 더 깁니다.
디코드할 때 "올바른 Base32 형식이 아닙니다" 오류는 왜 뜨나요?
입력한 문자열에 A-Z, 2-7 범위를 벗어나는 문자가 하나라도 있으면 발생합니다. 흔한 원인은 0, 1, 8, 9 같은 숫자나 Base64에서 쓰이는 +, / 기호가 섞여 들어간 경우입니다.
결과 끝에 붙는 등호(=) 개수는 왜 매번 다른가요?
원본 바이트 수를 5로 나눈 나머지에 따라 정해집니다. 나머지가 1바이트면 등호 6개, 2바이트면 4개, 3바이트면 3개, 4바이트면 1개가 붙고, 나머지가 없으면 등호가 붙지 않습니다.
입력한 텍스트가 서버로 전송되나요?
아니요. 인코딩과 디코딩 모두 브라우저 안에서 즉시 처리되며 별도의 서버 전송은 이뤄지지 않습니다.
