2.log

인코딩/디코딩과 Base64 대하여 본문

HACKING/Bandit+

인코딩/디코딩과 Base64 대하여

2.log 2023. 3. 22. 18:07
728x90
반응형

 

인코딩?

데이터 표준화, 처리 속도 향상, 공간 절약, 보안 등의 이유로 사람이 인지할 수 있는 문자(언어)를 약속된 규칙에 따라 컴퓨터가 이해하는 언어(0 과 1)로 바꾸는 것, 크게 1) 문자 인코딩 2) 사진&오디오&비디오 인코딩으로 나뉨

 

 


 

문자인코딩(Character Encoding)

문자를 바이트(bytes)로 변환 (컴퓨터는 오직 binary data 만 이해하기 때문)

 

 

1. HTML Encoding

HTML 페이지를 올바르게 나타내기 위해 사용되는 인코딩 종류 (UTF-8 등)

 

example

 

 

 

2. URL Encoding

인터넷을 통해 전송될 수 있는 포맷으로 문자를 변환시키는 인코딩 방식으로, ASCII character-set을 사용해 인터넷으로 URL 보내는데 사용 됨 (ex. URLEncode() )

 

특히 한글과 같은 Non-ASCII 문자는 % + 16진수 숫자로 인코딩해서 보내주어야 하는데 이 같은 이유로 URL 인코딩을 퍼센트 인코딩이라 부르기도 하며, 인코딩 될 때 문자는 triplet(트리플렛, 세 개가 한 묶음)들로 인코딩 됨

 

  • [예] 문자를 옥텟(octet, 8bit) 단위로 끊어 16진수로 표현하고 앞에 % 붙임
ECA1B0 %EC%A1%B0

 

  • 예약문자와 비예약 문자 (by RFC3986)

예약문자
비예약문자

이 때 예약문자는 문법적 의미를 가지므로 다른 의미로 사용하려면 반드시 인코딩 해야하며, 비예약문자들의 경우 퍼센트 인코딩 하지 않는 것을 권장함

 

 

 

 

3. UNICODE Encoding

전 세계 대부분의 언어 or writing systems 다룰 수 있고, 8/16/32 비트를 사용

 

  • UTF-8

유니코드 인코딩의 가장 기준이 되는 것으로 기본 8bit 사용

ASCII 코드와 직접적으로 호환가능하여 legacy app 업그레이드 시 대부분 UTF-8 선택함

대개 가장 적은 메모리 사용하나, 각 글자 넓이를 보장할 수 없어 string 조작에 어려움

 

 

  • UTF-32

최대메모리 사용하며 각 글자는 고정된 4바이트 넓이를 가져 string 조작이 수월함

 

 

  • UTF-16

UTF-8 과 UTF-32를 반씩 섞은 인코딩

대부분의 글자를 고정 넓이 16비트 값으로 함

UTF-8의 단점인 각 글자 넓이를 항상 알 수는 없다는 한계 가짐

 

 

 

 

4. ASCII(American Standard Code for Information Interchange) Encoding

라틴문자, 숫자, 일부 특수문자를 0-127까지 숫자에 1:1 대응시킨 7비트 single byte 인코딩

현재 컴퓨터가 8비트 = 1바이트로 표준화 되어 7비트를 사용하는 아스키코드는 앞에 0을 붙여 8비트로 인코딩 진행함

 

http://www.gnujava.com/board/article_view.jsp?article_no=4320&board_no=3&table_cd=EPAR01&table_no=01

 

 

 

5. Base64 Encoding

binary data를 ASCII 문자로 이루어진 text 로 바꾸는 것으로, 메일 시스템이나 간단한 HTTP인증에서 사용되며, tampering(부적절한 정보 수정) 방지를 위해 binary data를 쿠키나 다른 매개변수로 이동시킬 때에도 사용됨

 

예컨대 ASCII의 경우 7비트 인코딩이라 나머지 1비트 처리방식이 시스템별로 상이하고, 일부 제어문자(ex. 줄바꿈)역시 시스템 별로 다른 코드값을 가지므로 시스템간 데이터를 안전하게 전달하지 못함

 

하지만 base64는 ASCII 중 제어문자와 일부 특수문자를 제외한 64개의 안전한 출력문자(문자코드에 영향 받지 않는 공통 ASCII)를 사용해 통신과정에서 binary data(이미지, 오디오) 손실을 방지함

 

 

  • 인코딩 과정 
    1. 24비트 버퍼 생성하여 위쪽부터 1바이트(8bit)씩 3바이트를 채움
    2. 3바이트 미만일 경우 버퍼의 남은 부분은 0으로 채움
    3. 버퍼의 위쪽부터 6비트씩 잘라 값을 읽어 base64의 값으로 변경
    4. 버퍼의 남은 부분을 0으로 채운 값을 1바이트 당 '=' 으로 변경
     

octet : 8bit 덩어리 / sextets : 6bit 덩어리

 

이렇게 base64로 인코딩된 문자는 A-Z, a-z, 0-9, +=/ 로 구성되며 특히 '=' 기호의 경우 부족한 비트 수를 채우는 padding문자이므로 인코딩된 문자열이  '~=' 로 끝나면 base64가 적용되었다고 유추 가능함

 

 

  • 리눅스 명령어
옵션 설명
-d (or --decode) base64 decoding (옵션 없으면 인코딩)
-i 디코딩 시 알파벳 아닌 문자 무시

 

  • 문자열 인코딩/디코딩 예시

 

 

 

 

 

 

6. Hex Encoding (base16)

각 바이트를 두자리의 base16 인코딩으로 변환 후 일반적으로 이를 다시 ASCII 인코딩함

binary data 를 plain text 로 나타낼 때 자주 사용됨

 

 

 

 

+) Base64 vs Hex

base64는 3바이트 당 4자를, hex는 1바이트 당 2자를 사용하므로 공간효율은 base64가  더 좋음

 

 


 

사진&오디오&비디오 인코딩

효율적이고 압축된 포맷으로 인코딩이 진행되어 저장공간을 절약해주기 때문에 공간을 효율적으로 사용하게 해주며 메일이나 다운로드 방식으로 쉽게 이동/전달 가능

 

 


 

디코딩?

인코딩한 데이터를 다시 원래 데이터로 되돌리는 개념 (복호화)으로, 인코딩과 디코딩은 순환 구조를 가짐

 

 

 

 

 

 

 

출처 

https://codingpractices.tistory.com/entry/%EC%9D%B8%EC%BD%94%EB%94%A9-vs-%EB%94%94%EC%BD%94%EB%94%A9-%EC%A0%95%ED%99%95%ED%95%98%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

인코딩 vs 디코딩 정확하게 이해하기

이번 개발 프로젝트를 하며 인코딩, 디코딩을 많이 접했다. 개발을 진행하면서 많이 답답했었다. 기본 지식이 없는 상태에서 어떤 인코딩인지 어떻게 디코딩을 해서 써야할지 코드를 겨우 찾아

codingpractices.tistory.com

https://codingpractices.tistory.com/entry/Base64-%EC%9D%B8%EC%BD%94%EB%94%A9%EC%9D%B4%EB%9E%80-%EC%A0%95%ED%99%95%ED%95%98%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

Base64 인코딩이란? 정확하게 이해하기

base64 인코딩을 알아보기 전에 "인코딩, Encoding" 이란 무엇인지 간략하게 알면 더 좋을 것 같다. 인코딩이란? 어떠한 정보/데이터의 형태나 형식을 다른 형태나 형식으로 변환하는 것을 말한다.

codingpractices.tistory.com

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=j880825&logNo=221231640609 

 

[Percent Encoding] 왜 때문에 URL Encoding?

1루수가 누구야? 누구 1루수! 1루수가 누구냐고 1루수 이름이 누구라고.  - 'who's on first' &l...

blog.naver.com

 

728x90
반응형

'HACKING > Bandit+' 카테고리의 다른 글

Hexdump 와 xxd 명령어  (1) 2023.03.22
ROT13 과 tr 명령어  (0) 2023.03.22
sort와 uniq  (0) 2023.03.21
grep 옵션 정리  (0) 2023.03.21
파일설명자와 /dev/null 로 불필요한 출력 버리기  (0) 2023.03.21
Comments