베이스64

컴퓨터 분야에서 쓰이는 **Base 64** (베이스 육십사)란 6비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다. 원래 **Base 64**를 글자 그대로 번역하여 보면 64진법이란 뜻이다. 특별히 64진법이 컴퓨터에서 흥미로운 것은, 64가 2의 제곱수(64 = 26)이며, 2의 제곱수들에 기반한 진법들 중에서 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법이기 때문이다. 즉, 다음 제곱수인 128진법에는 128개의 기호가 필요한데 화면에 표시되는 ASCII 문자들은 128개가 되지 않는다. 그런 까닭에 이 인코딩은 전자 메일을 통한 이진 데이터 전송 등에 많이 쓰이고 있다. Base 64에는 어떤 문자와 기호를 쓰느냐에 따라 여러 변종이 있지만, 잘 알려진 것은 모두 처음 62개는 알파벳 A-Z, a-z와 0-9를 사용하고 있으며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있다. {| class="wikitable" align="right" |+ Base64 색인표 ! 값 ! 문자 ! 값 ! 문자 ! 값 ! 문자 ! 값 ! 문자 |- | 0 | A | 16 | Q | 32 | g | 48 | w |- | 1 | B | 17 | R | 33 | h | 49 | x |- | 2 | C | 18 | S | 34 | i | 50 | y |- | 3 | D | 19 | T | 35 | j | 51 | z |- | 4 | E | 20 | U | 36 | k | 52 | 0 |- | 5 | F | 21 | V | 37 | l | 53 | 1 |- | 6 | G | 22 | W | 38 | m | 54 | 2 |- | 7 | H | 23 | X | 39 | n | 55 | 3 |- | 8 | I | 24 | Y | 40 | o | 56 | 4 |- | 9 | J | 25 | Z | 41 | p | 57 | 5 |- | 10 | K | 26 | a | 42 | q | 58 | 6 |- | 11 | L | 27 | b | 43 | r | 59 | 7 |- | 12 | M | 28 | c | 44 | s | 60 | 8 |- | 13 | N | 29 | d | 45 | t | 61 | 9 |- | 14 | O | 30 | e | 46 | u | 62 | + |- | 15 | P | 31 | f | 47 | v | 63 | / |}
# MIME
MIME에서 정의하는 전자 메일 **base64**는 임의의 바이트 스트림을 화면에 표시할 수 있는 ASCII 문자들로 바꾸는 인코딩 방식을 말한다. 이 인코딩은 인터넷 전자 메일을 전송할 때 MIME의 content transfer encoding의 하나로 정의된다. 인코딩된 문자열은 알파벳 대소문자와 숫자, 그리고 "+", "/" 기호 64개로 이루어지며, "="는 끝을 알리는 코드로 쓰인다. 베이스64의 정확한 규격은 RFC 1421, RFC 2045에 정의된다. 연속된 8비트 바이트를 인코딩하도록 정의되어 있으며, 이는 대부분 시스템에서 파일의 정의와 들어맞는다. 베이스64 코딩을 거친 결과물은 원본보다 대략 4/3 정도 크기가 늘어나게 되며, 보통 의미없어 보이는 문자열이 나열된 형태가 된다. 데이터를 베이스64로 바꾸는 과정은 다음과 같다. 우선 24비트 버퍼에 위쪽(MSB)부터 한 바이트씩 세 바이트를 집어넣는다. 그리고 남은 바이트가 3바이트 미만이라면, 버퍼의 남은 부분은 0으로 채워넣게 된다. 그리고, 버퍼의 위쪽부터 6비트64 = 26이므로씩 잘라 그 값을 읽어, 다음에 정렬된 64개 `"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"`의 문자 중에서 읽은 값 번째 문자를 골라 출력한다. 만약 입력된 바이트가 하나라면 출력 중 두 개만이 사용되고 나머지 둘은 `"="`으로 패딩되며, 입력된 바이트가 둘이라면 출력 중 세 개 만이 사용되고 나머지 하나는 `"="`으로 패딩되게 된다. 이것은 원본으로 되돌릴 때 원본에는 없던 비트가 생기는 것을 방지하기 위함이다. 이 과정을 입력 데이터가 끝날 때까지 반복하면 인코딩이 된다. 예를 들어, 위키백과의 슬로건인 다음 문장은

Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.

위에서 설명한 과정을 거쳐 베이스64로 아래와 같이 변환된다.

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0
aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1
c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0
aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdl
LCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=

참고로, 첫 단어인 `Man`을 변환하는 과정은 다음과 같다. {| class="wikitable" | Text content | colspan="8" align="center"| **M** | colspan="8" align="center"| **a** | colspan="8" align="center"| **n** |- | ASCII | colspan="8" align="center"| 77 | colspan="8" align="center"| 97 | colspan="8" align="center"| 110 |- | Bit pattern ||0||1||0||0||1||1||0||1||0||1||1||0||0||0||0||1||0||1||1||0||1||1||1||0 |- | Index | colspan="6" align="center"| 19 | colspan="6" align="center"| 22 | colspan="6" align="center"| 5 | colspan="6" align="center"| 46 |- | Base64-Encoded | colspan="6" align="center"| **T** | colspan="6" align="center"| **W** | colspan="6" align="center"| **F** | colspan="6" align="center"| **u** |}
# UTF-7
RFC 2152에서 정의된 UTF-7은 Modified BASE64라 불리는 시스템을 의미한다. 이 data encoding scheme는 UTF-16을 SMTP와 같이 7비트를 사용하는 ASCII문자로 변환하는데 사용된다. 이는 MIME를 사용하는 BASE64 encoding의 변화된 방식이다. Modified BASE64 알파벳은 MIME BASE64 알파벳으로 구성되어 있으나, “ = ” 패딩 기호는 사용하지 않는다. UTF-7은 메일 헤더로 구성되어 사용되며RFC 2047로 정의, “ = ”기호는 quoted-printable encoding을 위한 이스케이프 문자로 사용된다. Modified BASE64는 간단하게 유용한 비트를 포함하고 있는 마지막 BASE64 숫자마지막 BASE64숫자 중 0~3을 제외한 미사용 비트 뒤에 바로 패딩과 끝을 생략한다.
# OpenPGP
RFC 4880에서 정의하고 있는 OpenPGP는 “ASCII Armor로 알려진 64진수 인코딩을 설명한다. 64진수는 MIME에서 정의하고 있는 BASE64 encoding과 동일하며, 추가적으로 24비트 CRC 체크섬을 포함하고 있다. 체크섬은 encoding 이전의 입력 데이터로 계산한다. 체크섬은 같은 BASE64 알고리즘으로 encoding되며, 추가적으로 “ = ” 기호를 구분자로 사용하여 인코딩된 출력 데이터에 추가된다.
# RFC 3548
RFC 3548(BASE16, BASE32, BASE64 Data Encodings)은 BASE64 encodings에 관한 RFC 1421과 RFC 2045의 내용을 통일시키는 정보이며, 드물게 BASE32와 BASE16에 관한 내용도 사용하고 있다. 특별히 선언되어 있지 않는 한은, RFC 3548은 인코딩 알파벳 이외의 문자를 사용한 메시지 생성을 허용하지 않고 있으며, 디코더는 인코딩 알파벳 이외의 문자가 포함되어 있는 데이터를 거부해야 한다.
# RFC 4648
이 RFC는 구 버전의 RFC 3548에 대하여 BASE64/32/16에 관한 내용이다. 이 문서는 일반적으로 사용되는 BASE64/32/16 encoding scheme에 대한 내용이다. 이는 또 인코딩 된 데이터의 line-feed, padding, 비(非) 알파벳 문자, 다른 방식으로 인코딩 된 알파벳 등의 사용과 규범적인 인코딩에 대한 내용을 다루고 있다.