최근 수정 시각 : 2024-10-01 17:01:23

BASE64

1. 개요2. 예시3. Base64 변환 표

1. 개요

바이너리 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 문자로 표현하기 위해 만들어진 인코딩이다. 네이버 지식iN 등의 URL에서 자주 볼 수 있는 형태의 바로 그것. ASCII 문자 하나가 64진법의 숫자 하나를 의미하기 때문에 BASE64라는 이름을 가졌다.

8비트짜리 바이트 3개를 6비트씩 4개로 쪼개어 Base64 코드 4개로 바꾸어 표현한다. Base64 코드를 바이너리로 디코딩하기 편하게 하기 위해 Base64 코드를 무조건 4글자 단위로 만들고, 빈 부분을 '=' 문자로 채워두기도 한다.[1]

iOS단축어앱에서 이를 지원하다 보니 인지도가 급상승 하였다. 사진, 오디오등의 미디어를 인코딩 하였다가 디코딩 하여 출력하는 방식이 유행하기 시작했다.[2]

미디어를 인코딩할 수 있다 보니 북한 내부에서 몰래 북한 외부의 미디어(주로 한류나 해외 음악이나 사진 및 책)등을 인코딩해 보관하여 북한당국의 검열을 피하는 방법으로 쓰이고 있다. 미디어를 인코딩하면 원본은 남지 않고 인코딩된 괴상한 문자열만 남기 때문에 관련 지식이 없는 사람에겐 그저 괴문자 덩어리로만 보여 이게 인코딩된 것인지 인지 할 방법이 없다. 그러나 이 방법도 결국 북한당국에게 탄로나기 시작하여 BASE64 인코더/디코더까지 단속하기에 이르렀다.

BASE64 코드를 쉽게 변환할 수 있는 사이트가 있다. 알고리즘이나 이미 존재하는 라이브러리를 이용해 직접 인코딩/디코딩 프로그램을 쉽게 만들 수 있다. 대표적인 변환 사이트로 BASE64, CyberChef 등이 있다. 어지간한 고급 프로그래밍 언어들 역시 기본 라이브러리로 제공해 주고 있다. 예컨대 Python의 base64 라이브러리가 있다.

표준 BASE64에서는 알파벳 대소문자와 숫자 총 62자로 부족한 두 글자를 '+'와 '/'를 쓰고 있는데, 웹페이지 주소와 같은 특정한 상황에서 이 특수문자들을 함부로 쓰기 곤란하다는 점 때문에[3] 이들을 다른 문자들로 바꿔서 쓰는 경우가 많다. 대표적으로 방금 말한 웹페이지 주소에 들어가는 것은 '_'와 '-'를 대신 쓰기도 한다. 한편, 패딩에 쓰이는 문자도 쓰기 곤란한 경우,[4] 그냥 패딩을 빼 버리기도 한다. 앞서 언급했듯이 패딩 없이도 복호화엔 문제가 없기 때문이다.

2. 예시

'E1L'을 Base64로 인코딩하는 과정은 아래와 같다.
<colbgcolor=#f5f5f5,#2d2f34> 원문 E 1 L
바이트 값 0x45 0x31 0x4C
2진수 010001010011000101001100
변환 값 17 19 5 12
결과 R T F M
결과는 'RTFM'. 디코딩은 이 표에 나온 과정을 거꾸로 하면 된다.

리눅스에서는 base64 명령을 다음과 같이 사용할 수 있다.
$ echo -n E1L | base64
RTFM
$ echo RTFM | base64 --decode
E1L

3. Base64 변환 표

<colbgcolor=#f5f5f5,#2d2f34> 문자 <colbgcolor=#f5f5f5,#2d2f34> 문자 <colbgcolor=#f5f5f5,#2d2f34> 문자 <colbgcolor=#f5f5f5,#2d2f34> 문자
0A 16Q 32g 48w
1B 17R 33h 49x
2C 18S 34i 50y
3D 19T 35j 51z
4E 20U 36k 520
5F 21V 37l 531
6G 22W 38m 542
7H 23X 39n 553
8I 24Y 40o 564
9J 25Z 41p 575
10K 26a 42q 586
11L 27b 43r 597
12M 28c 44s 608
13N 29d 45t 619
14O 30e 46u 62+ 또는 -
15P 31f 47v 63/ 또는 _


[1] 종류에 따라 채우지 않기도 한다. 어차피 채우지 않아도 디코딩할 때 꼬일 염려는 없다.[2] 이렇게 하여 충전기 연결 효과음을 변경한다던지 바꾸지 못하는 알림음을 변경한다던지 등 유용하게 쓰인다.[3] '+'는 %20와 더불어 띄어쓰기를 표현하는 한 방식으로 쓰고 있으며, '/'는 디렉토리를 나누는 문자로 쓰인다. 한편, '=' 역시 주소에 들어가는 인자를 표현하는 데에 쓰인다.[4] '=' 기호