base64 란 ?

8비트 이진데이터를(예를 들어 실행 파일이나, ZIP파일등..) 공통아스키 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식

왜 사용하는가?

공통된 아스키영역의 문자들만을 사용함으로써 다른 문자코드에 영향을 받지 않음.

인코딩 / 디코딩원리


위에서 말했듯이 Base64 인코딩은 64개의 문자를 이용하여 바이너리 데이터를 공통아스키 영역의 문자들로 변환하는 인코딩 방식이다. 즉 8bit의 데이터(바이너리)를 6bit크기로 표현한다. 따라서 3개의 문자(24bit) 단위를 기준으로 4개의 인코딩된 문자를 얻을 수 있다.



위와같이 abc(24bit)를 base64 방식으로 인코딩하면 YWJj(24bit) 4개의 문자를 얻을 수 있다.


<base64 테이블>


그렇다면 3개(24bit)의 문자단위가 아닐때는 어떻게 될까..?

위의 예시처럼 a(8bit)를 24bit 단위로 표현하면 01100001 0000000 0000000 와 같이 되는데 base64는 6비트단위씩 끊으므로
011000 010000 000000 000000로 변환이 된다.  000000은 A인데 왜 =로 표현되느냐? '='은 bit수를 맞춰주기 위해 0으로 채워주는 패딩값의 표현이다.
즉 문자(바이너리데이터)수가 3n+1이라면 24bit + 8bit인데 24bit단위로 맞춰주기위해 3n(24bit) + 1(8bit) + 16bit를 해주게 되는데, 8bit에서 앞의 6bit는 base64로 인코딩되고 , 남은 2bit와 뒤에 0으로채워진 4bit로 하나의 인코딩된값을 또 얻을 수 있다. 남은 12bit를 2개의 '='으로 채워주게 된다.
즉 3n+1 문자개수라면 '='의 개수가 2개가 되고 , 3n+2 문자개수라면 '='의 개수는 1개가 된다. 


<디코딩의 문제점>

인코딩의 원리는 위와같고, 같은원리로 디코딩역시 YQ== 은 a로 디코딩되는 것을 알 수 있을텐데 여기서 한가지 문제가 발생한다. 인코딩 원리에서 말했듯이 '='이 2개면 3n+1의 문자개수이고 , '='이 1개면 3n+2의 문자개수를 나타낼수 있다.

디코딩 과정에서 '='이 2개면 인코딩된 문자(24bit)중 앞의 8bit만 바이너리 데이터로 변환하고 , 남은 bit는 어떤값이 되던지 신경쓰지 않는다. '='이 1개면 인코딩된 문자(24bit) 중 앞의 16비트만 바이너로 데이터로 변환하고, 마찬가지로 남은 bit값이 어떤값인지 신경쓰지 않는다. 

즉 인코딩된 문자열 YR==,YS==,YT== 등 더있을수있음 디코딩을 해보면 모두 'a'가 나온다.  충돌이 일어날 수 있는 수는 3n+1개의 문자일때는 뒤의 12비트에서 8비트만 정상디코딩이 되고, 남은 4비트가 충돌이 일어나므로 2의 4승인 16개가 생기고 , 3n+2의 문자일때는 2의2승인 4개가 생길것이다.





[출처] http://bbolmin.tistory.com/46




'CS > 개발지식' 카테고리의 다른 글

문자 표현 방식  (0) 2019.02.16
OOP  (0) 2017.03.21
프로세스와 쓰레드의 차이점  (0) 2017.03.20
Runnable 과Thread의 차이  (0) 2017.03.19

+ Recent posts