base64 encoding 알아보기 (좀 필요 이상으로 많이)

두비니

·

2021. 7. 7. 23:53

 

 

 


base64 encoding 알아보기

(좀 필요 이상으로 많이)


 

 

1. 개요

 

base64 encoding 기법은 CTF부터 시작해서 실생활에서도 정말 많이 사용되는 encoding 기법 중 하나입니다. 

사실 현실은 온라인으로도 툴이 너무 잘되어있어서, 걍 원리고 뭐고 걍 일단 집어넣어보는 정도인 것 같습니다.

이번 글에서는 진짜 얘가 뭔지, 왜 필요한지, 어떤 과정으로 이루어지는지 봅시다.

그러면 일단 base64부분을 알아보기 전에, encoding부터 알아봅시다.

 

 

Encoding

 


문자 인코딩(영어: character encoding), 줄여서 인코딩은 사용자가 입력한 문자 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다.

source : https://ko.wikipedia.org/wiki/%EB%AC%B8%EC%9E%90_%EC%9D%B8%EC%BD%94%EB%94%A9

 

위에 보면 알 수 있듯이, 우리의 입력값을 컴퓨터가 알 수 있는 신호로 만드는 것을 말합니다. 굳이 이렇게 바꾸는 이유는 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 변환을 하곤 합니다. 보통은 영상/이미지를 바꾸는데 많이 사용이 됩니다.

그럼 이 기본지식을 가지고 가봅시다 owo

 

Base64 Encoding

 

앞서 알아본 것처럼, base64 encoding을 사용하는 이유도 Binary Data를 text로 바꾸기 위함입니다. 

Base64라는 말을 그대로 직역하면 64진법이라는 뜻입니다. 왜 굳이 64라는 숫자를 선택했냐, ASCII문자들을 모두 표현할 수 있는 가장 작은 진법이기 때문입니다.

혹시나 여기서, 아스키 문자는 128개 아닌가요?? 라고 물으신다면, 아래 사진에 명시된 문자들을 보시면 될 것 같습니다. 제어문자는 포함시키지 않고, 대/소문자와 숫자만 포함한답니다 :)

 

혹시나 싶어서 추가합니다.

일단 base64는 사용하는 64개의 문자에 따라 다양한 변종이 있습니다. 저는 그 중 가장 보편적으로 쓰이는 친구를 들고 왔습니다. 참고로 추가하자면, 보통 처음 62개는 [A-Za-z0-9]를 사용하며, 마지막 2개에 따라 달라지는 방식입니다.

아무튼! 그래서 base64인코딩 과정은 먼저 24bit의 buffer를 생성하여 위쪽(MSB)부터 바이트 데이터를 넣은 뒤,

버퍼의 위쪽부터 6bit 단위로 잘라 Base64 테이블의 ASCII 문자로 변환합니다. 

 

지금 이 과정 자체는 밑에서 더 자세히 알아보도록 합시다. 

 

마지막으로 특징만 몇 가지 더 알아본다면, 보통 끝에 '='글자가 붙는다는 점이 있겠네요.(안붙을 때도 있습니다)

 

2. 원리

 

흠쓰

굳이 알아야 할 필요가 있나하는 생각이 들 수도 있는데, 

 

아 웨 궁금할수도 있짜나

 

아 왜 궁금할 수 이짜나 그치? 그치그치?

아무튼 알아보도록 합시다.

 

기본적인 원리는 이러합니다.

 

문자열 입력 -> ASCII/Binary -> 6bit cut -> base64_encode

 

쉬운 이해를 위해 예시를 통해 봅시다.

제가 "Man"이라는 단어를 encoding하고싶다고 가정합시다.

 

이 문자열을 ascii문자(binary)로 바꾸는 과정을 간단합니다.

 

 

네 여기까진 질문이 없겠졍??

그리고 이제 이걸 6bit를 기준으로 나누게 됩니다. 

왜 6비트냐구요? 위에 있는 base64 테이블을 보고 옵시다. 26=64니까, 저 테이블에 대응시키려고 6비트씩 자르는 겁니다~.~

그럼 다시 봅시다.

8비트짜리를 6비트단위로 나누고, 이걸 위 테이블에 맞춰서 대응시켜보니, "TWFu"라는 문자열이 나오네요!!

이런식으로 이루어진다고 보시면 됩니다.

 

 

3. Padding

 

설명을 보면 알 수 있듯이, base64 encoding을 할 때는 비트수가 6의 배수여야 바꿀 수 있습니다. 그러면 8과 6의 최소공배수인 mod 24bit로 문자열이 구성되어야할까요...?? 당연히 아니겠죠?

이런 일을 막기 위해 padding을 이용합니다.

 

다른 암호 체계를 공부해보신 분들은 이미 친숙하겠지만, 간단히 설명하자면 그냥 아다리를 맞추기 위해 넣는 값이라고 보면 됩니다. 우리가 택배를 보낼 때에도 공간이 남는다고 물건을 더 사서 넣는게 아니라 그냥 뾱뾱이로 싸서 넣어놓잖아요?? 그런 갬성이라고 보시면 됩니다.

 

아무튼 패딩 이야기로 돌아와서, base64에서의 패딩은 크게 두 종류가 있습니다. 

 

1) 총 비트수가 mod 6이 아닐때

예를 들어 한 글자를 인코딩한다고 가정하면, 8bit이기때문에 6bit로 한 글자를 변형하고, 나머지 2bit는 처리할 방법이 없습니다. 이건 간단하게 0으로 남은 자리를 채워넣고, 그걸 encoding합니다. 아래 사진을 보면 더 쉽게 이해 가능할 듯

 

 

뒤에 붙는 =은 일단 무시하면 됩니다. 바로 밑에서 다룰 거거든요!

 

2) 총 바이트수가 mod 4가 아닐 때

비트의 개념이 아니라, 바이트의 수도 4의 배수가 아니면 패딩이 더 들어갑니다. 

바로 위에서 본 '='를 패딩 문자로 사용합니다. 이해를 위해 예시를 하나 더 붙입니다.

 

 

근데 기억하실지는 모르겠지만, base64 encoding의 가장 큰 특징이 뒤에 =가 붙는다는 것인데, 이건 안붙을 때도 있다고 언급해놨습니다. 이제 왜 없을 수도 있는지 알겠죠?? 모든 아다리가 아름답게 맞아떨어질때는 패딩이 없습니다ㅎㅅㅎ

 

4. 이걸 왜 써??

 

위의 글을 잘 읽었다면 알 수 있지만, 33%정도의 오버헤드가 발생하고, 귀찮게 계산을 해야합니다. 그럼 굳이 왜 쓸까요?? 

우선 안전하게 전송할 수 있다는 장점이 있습니다.

예를 들어서 신뢰할 수 없는 곳에서 통신을 통해 이미지를 받아야 한다면, 손실 없이 안전하게 데이터를 전송할 수 있어서 쓰입니다. 

 

대표적인 문제들로는 다음이 있습니다.

  • 7 bit encoding을 사용하는 ASCII코드를 처리할 때, 8bit로 맞추기 위해 사용하는 방식이 시스템 별로 상이함
  • 제어 문자(LF 등등)는 보통 시스템별로 다른 코드값을 가짐

따라서 값이 달라지거나 변조되는 것을 막기 위해, 모두가 공통적으로 쓰는, 믿고 사용할 수 있는 안전한 출력 문자들만 모아서 보여주는 것입니다. 이러면 좀 이해가 되겠죠??

 

오늘은 base64 encoding에 대해서 알아보았습니다.

걍 ctf에서 나오면 툴로 돌리는게 끝이였는데, 이런 비하인드 스토리가 있었네요.

 

굳굳

끝!

0개의 댓글