파일 업로드
  1. base64hub
  2. 기타 진법
  3. Base32 디코더

Base32 디코더: Base32를 텍스트나 Hex로

Base32 문자열을 붙여넣고 디코딩된 텍스트를 읽으세요. 소문자, 공백, 빠진 = 패딩도 괜찮으므로 설정 화면에서 복사한 2FA 시크릿도 그대로 디코딩됩니다.

무료 가입 없음, 제한 없음 로컬 업로드 없음 관대한 입력 대소문자, 공백, 패딩 없음 모두 가능 업데이트 2026. 10. 27.
입력 0바이트 0 B출력 0

브라우저에서 처리됩니다. 이 페이지는 데이터를 어디로도 보낼 수 없습니다 – 확인 방법

Base32를 디코딩하는 방법

  1. 입력 · Base32 (RFC 4648) 에 문자열을 붙여넣으세요. 대문자든 소문자든, 묶음 사이의 공백과 줄 바꿈도 모두 받으며, = 패딩은 선택 사항입니다.
  2. 출력 · 텍스트에서 디코딩된 텍스트를 읽으세요. 기본 문자 인코딩은 UTF-8입니다. 다른 시스템에서 온 텍스트가 깨진다면 출력 아래의 문자 인코딩을 바꾸세요(예: EUC-KR).
  3. 출력이 알 수 없는 기호 덩어리라면 바이너리 데이터입니다. 변환 후를 Hex나 Base64로 바꿔 바이트를 보거나, 바이트 저장을 눌러 파일로 내려받으세요.
  4. 입력이 다른 알파벳을 쓴다면 변환 전을 Base32hex, Crockford Base32, z-base-32로 바꾸세요.
  5. 인코딩하려면 방향 전환에서 텍스트 → Base32 (RFC 4648) 를 누르거나 Base32 인코더를 쓰세요.

디코더가 받는 것과 거부하는 것

이 디코더는 형식에는 관대하고 내용에는 엄격합니다.

입력결과
JBSWY3DPHello
jbswy3dpHello. 대소문자는 상관없음
JBSW Y3DP EHPK 3PXP10바이트, hex로 48656c6c6f21deadbeef
MZXW6YQfoob. 패딩이 없어도 됨
JBSWY3D0오류: 8 위치에 예상하지 못한 문자가 있습니다: "0"

오류는 알파벳에 없는 첫 문자를 가리킵니다. 0, 1, 8, 9가 있다면 거의 언제나 다른 Base32 알파벳을 쓰는 문자열이고, +나 /가 있다면 사실 Base64이니 Base64 디코더를 써 보세요.

2FA, TOTP 시크릿 디코딩하기

인증 앱이 설정할 때 보여 주는 키는 흔히 jbsw y3dp ehpk 3pxp처럼 묶여 있으며, RFC 4648 Base32입니다. 디코딩하면 원시 HMAC 키가 나오는데 무작위 바이트이므로 텍스트보다 Hex로 보세요. 길이로 키 크기를 알 수 있습니다. 16자는 10바이트, 32자는 20바이트(RFC 4226이 권장하는 160비트), 52자는 32바이트입니다.

맞는 시크릿인지 확인하려면 그것으로 코드를 만들어 보세요. 다음 Python 함수는 시크릿을 같은 관대한 방식으로 디코딩한 뒤 RFC 6238을 따릅니다.

import base64, hashlib, hmac, struct

def totp(secret, t, digits=6, step=30):
    s = secret.replace(" ", "").upper()
    key = base64.b32decode(s + "=" * (-len(s) % 8))
    mac = hmac.new(key, struct.pack(">Q", t // step), hashlib.sha1).digest()
    off = mac[-1] & 0x0F
    code = struct.unpack(">I", mac[off:off + 4])[0] & 0x7FFFFFFF
    return str(code % 10**digits).zfill(digits)

totp("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", 59, 8)   # '94287082'

이 시크릿과 기대값 94287082는 RFC 6238의 SHA-1 테스트 벡터입니다. 현재 코드를 얻으려면 t에 int(time.time())을 넘기세요. 더 많은 디코딩 패턴은 Python 페이지에 있습니다.

IPFS CIDv1과 접두사가 붙은 Base32

일부 형식은 Base32 앞에 표시를 붙입니다. IPFS CIDv1 문자열은 패딩 없는 소문자 RFC 4648 Base32를 뜻하는 multibase 코드 b로 시작합니다. bafybei…에서 b는 접두사이고 afybei…가 데이터입니다. b를 지우고 디코딩한 뒤 변환 후를 Hex로 바꾸세요. 첫 바이트들은 CID 버전(01), 콘텐츠 타입(dag-pb는 70), multihash 헤더(32바이트 SHA-256은 1220)입니다.

Tor v3 onion 주소도 접두사 없이 같은 방식입니다. .onion 앞의 56자는 35바이트의 Base32이며, 32바이트 공개 키, 2바이트 체크섬, 버전 바이트(03)로 이루어집니다.

자주 겪는 문제

  • Python이 binascii.Error: Non-base32 digit found를 냅니다. 입력이 소문자입니다. b32decode에 casefold=True를 넘기거나 먼저 .upper()를 호출하세요.
  • Python이 binascii.Error: Incorrect padding을 냅니다. = 기호가 제거된 것입니다. 위 함수처럼 길이를 8의 배수로 채우세요.
  • base32 -d가 invalid input이라고 합니다. GNU coreutils는 소문자도 공백도 받지 않습니다. 먼저 문자열을 정리하거나 여기서 디코딩하세요.
  • 텍스트가 디코딩되지만 엉뚱한 내용입니다. Base32hex와 Crockford 문자열은 잘못된 알파벳으로도 오류 없이 디코딩됩니다. 출처에 “Base32"라고 되어 있고 문자열에 0, 1, 8, 9가 없다면 여전히 RFC 4648일 가능성이 가장 높습니다. 그렇지 않다면 나머지 두 가지를 시도해 보세요.

자주 묻는 질문

TOTP 시크릿은 어떻게 디코딩하나요?

시크릿(otpauth:// 링크의 secret= 값이나, 앱이 QR 코드 대신 보여 주는 텍스트 키)을 붙여넣고 변환 후를 Hex로 바꾸세요. 결과가 원시 HMAC 키입니다. 무작위 바이트이므로 텍스트 출력은 깨진 글자처럼 보이는데, 정상입니다.

Base32를 디코딩할 때 Python이 왜 Incorrect padding이라고 하나요?

base64.b32decode는 길이가 8의 배수이기를 요구합니다. 먼저 빠진 =를 붙이세요: s + "=" * (-len(s) % 8). 이 디코더에는 패딩이 필요 없습니다.

여기서 ULID를 디코딩할 수 있나요?

바로는 안 됩니다. ULID는 Crockford 알파벳을 쓰지만, 128비트 숫자 하나를 26자로 인코딩하며 앞에 남는 2비트로 시작합니다. 여기의 Crockford 옵션은 첫 문자부터 바이트를 비트 단위로 채우므로, ULID에 대해서는 밀린 바이트를 돌려줍니다.

Base32에서 올바르지 않은 문자는 무엇인가요?

RFC 4648 Base32에서는 A–Z, 2–7, 끝의 =를 제외한 모든 문자입니다. 숫자 0, 1, 8, 9가 있다면 대개 base32hex나 Crockford라는 신호입니다. 변환 전을 바꿔 시도해 보세요.