Base32 인코더/디코더

텍스트와 Base32를 상호 인코딩·디코딩

텍스트Base32

Base32 인코더/디코더 소개

Base32는 바이트를 대문자 A~Z와 숫자 2~7, 모두 32개 문자로 적는 방식입니다(RFC 4648 6절). Base64보다 결과가 길지만 대소문자를 구분하지 않고, 헷갈리기 쉬운 0·1·8·9가 없어서 사람이 눈으로 읽고 손으로 입력하는 값에 쓰입니다. 대표적인 곳이 OTP 인증 앱의 「설정 키」입니다.

이 도구는 텍스트를 UTF-8 바이트로 바꾼 뒤 RFC 4648 표준 알파벳으로 인코딩하고, 결과 길이가 8의 배수가 되도록 =를 붙입니다. 디코딩할 때는 소문자도 받아들이고, 공백·줄바꿈과 끝의 =는 무시합니다.

5바이트가 8글자가 되는 계산

32 = 2⁵이므로 한 글자가 5비트를 담습니다. 바이트(8비트)와 5비트의 최소공배수는 40비트라서, Base32는 5바이트를 한 묶음으로 보고 8글자로 적습니다. 크기는 ceil(n/5)×8, 즉 원본의 1.6배(+60%)입니다. 같은 데이터를 Base64로 적으면 +33%이니 Base32가 눈에 띄게 깁니다.

마지막 묶음이 5바이트보다 짧으면 남은 비트를 0으로 채워 글자로 만들고 나머지를 =로 채웁니다. 남은 바이트가 1·2·3·4개일 때 패딩은 각각 6·4·3·1개입니다. RFC 4648의 시험 벡터 「foobar」가 MZXW6YTBOI======로 끝에 = 여섯 개가 붙는 이유가 이것입니다(6바이트 = 5바이트 한 묶음 + 1바이트).

왜 굳이 Base32를 쓰나

Base64는 대소문자를 구분하고 +, /, = 같은 기호가 섞여서 전화로 불러 주거나 종이에 적어 옮기기 어렵습니다. Base32 표준 알파벳은 대문자와 2~7만 쓰고, 숫자 0·1·8·9가 없으니 O·I·B와 헷갈릴 일도 없습니다. 대소문자를 가리지 않으니 사용자가 소문자로 입력해도 같은 값입니다.

OTP 앱(Google Authenticator 등)의 QR 코드에 들어 있는 otpauth:// 주소의 secret 값이 Base32입니다. QR을 못 찍을 때 화면에 나오는 「JBSWY3DPEHPK3PXP」 같은 문자열이 바로 그것이고, 앱은 이 문자열을 Base32로 디코딩한 바이트를 HMAC 키로 씁니다. 그래서 설정 키를 이 도구로 디코딩해 텍스트로 보면 대부분 의미 없는 깨진 문자가 나옵니다. 원래 무작위 바이트이기 때문입니다.

Base32는 한 종류가 아니다

RFC 4648에는 이 도구가 쓰는 표준 Base32 외에 「base32hex」(0~9, A~V)가 따로 있습니다. 정렬 순서가 원래 바이트 순서와 같아지는 장점이 있어 DNSSEC의 NSEC3 레코드에 쓰입니다. 이 밖에 Crockford Base32, z-base-32 같은 비표준 변형도 널리 쓰입니다. 알파벳이 다르면 같은 문자열이 전혀 다른 바이트로 풀리므로, 이 도구에서 「유효하지 않은 문자」 오류가 나면(예: 숫자 0, 1, 8, 9가 들어 있음) 다른 변형일 가능성을 먼저 의심하세요.

예시

RFC 4648 시험 벡터

입력
f / fo / foo / foob / fooba / foobar
결과
MY====== / MZXQ==== / MZXW6=== / MZXW6YQ= / MZXW6YTB / MZXW6YTBOI======

1~4바이트 남을 때 = 개수가 6·4·3·1로 줄고, 5바이트에서 딱 떨어집니다. RFC 10절의 값과 같습니다.

OTP 예제 키의 정체

입력
Hello
결과
JBSWY3DP

여러 OTP 라이브러리 문서의 예제 키가 JBSWY3DP로 시작하는 건 「Hello」를 Base32로 적은 값이기 때문입니다.

한글은 바이트가 늘어난다

입력
한글
결과
5WKZZ2VYQA======

UTF-8로 6바이트라 5바이트 한 묶음 + 1바이트가 되어 8+8글자, 그중 = 6개입니다.

대소문자 무시

입력
nbswy3dp (디코딩)
결과
hello

소문자로 넣어도 NBSWY3DP와 같은 결과입니다. 반면 NBSWY3D0처럼 숫자 0이 섞이면 「유효하지 않은 Base32 문자: 0」 오류가 납니다.

사용 방법

  1. 인코딩 방향이면 텍스트를, 디코딩 방향이면 Base32 문자열을 붙여 넣습니다.
  2. 결과가 바로 오른쪽에 나타납니다. 방향 전환 버튼으로 입출력을 뒤집을 수 있습니다.
  3. 오류가 나면 입력에 0·1·8·9나 기호가 섞였는지, 다른 Base32 변형인지 확인합니다.

자주 묻는 질문

OTP 설정 키를 디코딩하면 글자가 깨져 나와요.

정상입니다. 설정 키는 무작위 바이트를 Base32로 적은 것이라 텍스트가 아닙니다. 이 도구는 결과를 UTF-8 텍스트로 보여 주므로 텍스트가 아닌 바이트는 � 등으로 표시됩니다.

Base32와 Base64 중 무엇을 써야 하나요?

기계끼리 주고받는 값은 더 짧은 Base64가 낫습니다. 사람이 읽고 입력하거나, 대소문자를 구분하지 않는 시스템(일부 파일 시스템, DNS 이름)에 넣어야 한다면 Base32가 맞습니다.

끝의 =를 빼도 되나요?

이 도구는 = 없이도 디코딩합니다. OTP 설정 키처럼 패딩을 생략해 보여 주는 경우가 많습니다.

Base32도 암호화가 아닌가요?

아닙니다. 알파벳표만 있으면 누구나 되돌릴 수 있습니다. OTP 키가 비밀인 이유는 인코딩 때문이 아니라 그 바이트 자체가 비밀이기 때문입니다.

출처

기준일:

개인정보와 저장 방식