본문 바로가기
IT-개발,DB

[개발/알고리즘] Base64 변환 알고리즘 (encode / decode base64)

by SB리치퍼슨 2011. 12. 13.

BASE가 64라는 것은 모든 정보를 64진수로 표시한다는 것인데, 
컴퓨터는 2진수를 사용하므로 64진수로 표시하기 위해서는 

2^6 = 64  

즉, 6  bit 2진수 열이 필요하다.

그런데 컴퓨터에서 가장 기본이 되는 정보 단위는 8 bit로 구성된 Byte 단위이므로
6 bit와 8 bit가 각각 나누어 떨어질 수 있는 공배수의 최소값 (최소 공배수)를 구하면 24 bit가 된다.

24 bit는 8 bit 이고 Byte로 변환하면 3 Byte가 된다.
64진수로 표현하려면 6 bit 구성으로  4 단위가 된다. 

따라서 Base64의 인코딩 원리는 3 Byte 단위마다 (즉, 24 bit 마다) 6 bit씩 나누어서 6 bit 문자 4개로 만드는 것이다.
이 때 6 bit씩 쪼개진 단위를 A-Z a-z 0-9 +- (모두 64개 문자)로 각각 대응시키면 Base64 인코딩이 된다.
다만, 실제 데이터 길이가 3 Byte에 미치지 못한다면 '='로 대체 한다.


Base64 Encoding / Decoding

그런데 입력되는 정보가 모두 3 Byte씩 매칭된다는 보장이 없으므로 3 Byte로 나누어떨어지지 않는 경우 '=' 문자로 채우기를 한다. 
즉 Base64로 인코딩 된 데이타에서 '=' 가 보이면 그 것은 다시 원래의 정보로 되돌아 갈때 (디코딩 될때) 아무 것도 없는 것이라는 소리가 된다.
(Base64로 인코딩 정보의 끝에 최대 나올 수 있는 = 의 수는 2개가 된다)

디코딩은 A-Z a-z 0-9 +- 문자를 각각 6 bit의 정보로 바꾸어서 4 단위 (6*4=24  bit) 마다 합쳐서 3 Byte (3*8=24  bit) 로 다시 복원시키면 된다.

이러한 2진수 데이터를 64진수형으로 변환하여 64개의 아스키 코드에 대입하는것이 Base64 알고리즘의 기본이다. 
또한 이런 변환을 하는 이유는 암호화에도 있겠지만 보통은 안전한 64개의 아스키문자열로 변환하여 원할한 데이터를 전송하는데 있다. 
예를 들자면 한국어의 경우 2 Byte 문자열로 그대로 전송할시 문자열의 깨짐이 발생 할 수 있다. 이는 데이터 전송시 원하지 않는 결과이며 
이러한것을 막기 위해 안전한 아스키코드 문자로 변환하여 전송 하는것이다. 
보통 이러한 Base64인코딩 디코딩은 이메일 전송시 많이 사용된다. 하지만 데이터가 기존의 데이터보다 약 30%이상 커진다는 단점이 있다.
 그럼 일반 문자열을 Base64로 인코딩은 어떻게 하면 될까? 답은 다음의 스텝대로 시도하면 된다.
소스의 바이너리 데이타로 부터 3 Byte씩 꺼낸다. 만약 나머지 소스 문자열이 3 Byte가 되지 않는다면 0으로 채운다.
최초  Byte의 MSB를 6 bit씩 4개의 숫자로
각각의 수치를 하단의 표를 토대로 아스키 문자로 변환한다. 다만 실제의 데이터 길이가 3 Byte에 미치지 못한다면 '='로 대체 한다.
이후 데이터가 없어질때까지 1~3을 반복한다.


반응형

댓글