BASE64

Posted by lib oimb
2018. 6. 25. 17:25 TOPIC

BASE64 (베이스64)


- 8비트 이진 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다


- 64진법




MIME


- MIME에서 정의하는 전자 메일 BASE64는 임의의 바이트 스트림을 화면에 표시할 수 있는  ASCII 문자들로 바꾸는 인코딩 방식을 말한다.

인코딩된 문자열은 알파벳 대소문자와 숫자, 그리고 "+", "/" 기호 64개로 이루어지며, "="는 끝을 알리는 코드로 쓰인다.

- 베이스64의 정확한 규격은 RFC 1421, RFC 2045에 정의된다.

- 베이스64코딩을 거친 결과물은 원본보다 대략 4/3 정도 크기가 늘어나게 되며, 보통 의미없어 보이는 문자열이 나열된 형태가 된다.


과정


데이터를 베이스64로 바꾸는 과정은 다음과 같다. 

1. 우선 24비트 버퍼에 위쪽(MSB)부터 한 바이트씩 세 바이트를 집어넣는다. 

2. 남은 바이트가 3바이트 미만이라면, 버퍼의 남은 부분은 0으로 채워넣게 된다.

3. 버퍼의 위쪽부터 6비트씩 잘라 그 값을 읽어, 위 그림에 정렬된 64개의 문자중에서 읽은 값번째로 치환

4. 남은 부분(0으로 채워진 부분)에 대해서는 =로 바꿔준다

( * 이는 원본으로 되돌릴 때 원본에 없던 비트가 생기는 것을 방지 하기 위함)


위 4가지 과정을 반복하여 끝이 나면 인코딩이 된다.


예 )  2바이트인 11111100/11111111은 24비트로 11111100/11111111/00000000이 되고, 

6비트씩 묶으면 111111/001111/111100/000000이며, 이는 다시 /P8=  으로 변환된다.




왜  ASCII를  사용하지 않고 Base64를 사용 하는가?


     여러 이유가 있지만

1. 아스키 코드는 7비트를 사용  => 일반적으로 프로그램들은 8비트를 단위로 사용한다.

2. 아스키 코드는 문자 이외의 제어에 사용하는 문자 까지 포함.


이러한 이유로 인코딩 방식에는 적합하지 않다고 한다.


Base64는 먼저 A-Z,a-z,0-9, +2개의 특수문자를 사용 하며 8비트 이진데이터를 수용 할수 있다.

그리고 여기서 6개씩 끊는 이유는 아스키 코드와 근접 하면서 제어에 사용되는 문자를 제외하며 가장 큰값이 2의6제곱 인데

이로 인해 6개씩 끊어서 사용한다.


그리고 인코딩 방식이긴 하나 암호화가 목적이기 보다는 이진 데이터를 문자로 바꾸기 위한 수단으로 보는것이 맞다고 한다.


추가)


원문 -> 암호화 -> BASE64(인코딩) ~~ BASE64(디코딩) -> 복호화 - > 원문  이러한 과정을 보통 거치는데

여기서 BASE64의 역할을 인코딩하여 사람이 보고 읽을수 있는 결과물을 만들기 위해서 거치는 과정이라고 생각한다.

그리고  참고로 암호화 이후 인코딩과정만 거치는 단방향 알고리즘이 존재하는데 이 경우는 따로 복호화 과정이 존재 하지 않다.

따로 복호화 과정일 필요없을 뿐더러 노출될 위험 가능성이 존재하기 때문이다.


참고)

*spec 

개발한 내용 및 데이터에 접근 및 인코딩 과정에서 자신이 정해 놓은 기준을 의미한다.







 


'TOPIC' 카테고리의 다른 글

끄적끄적 REST API ? <1>  (0) 2019.03.12
IP address  (0) 2018.07.10
Call by Value or Reference in JAVA  (0) 2018.07.02
3-WAY Handshake  (0) 2018.06.27
Unicode,UTF  (0) 2018.06.25
BASE64  (0) 2018.06.25
이 댓글을 비밀 댓글로