공부해봅시당

[CS] 인코딩과 암호화, Base64는 인코딩일까 암호화일까? 본문

STUDY/CS

[CS] 인코딩과 암호화, Base64는 인코딩일까 암호화일까?

tngus 2024. 5. 5. 18:04

먼저 인코딩과 암호화의 개념을 헷갈려하는 이유에 대해 살펴보자

보통 인코딩과 암호화의 개념을 헷갈려하는 이유는 두 개념이 가진 공통점 때문이다.

둘 다 `기존의 데이터를 원하는 데이터 형식으로 변환`한다.

 

예를 들어 이런 것이다.

`Hello, World!`가 `SGVsbG8sIFdvcmxkIQ==` 이런 식으로 인간이 알아들을 수 없는 언어로 바뀌는 것 말이다.

인코딩과 암호화는 둘 다 이런 식으로 알아들을 수 없는 문자로 변경된다는 점에서 공통점을 가지기 때문에 인코딩과 암호화를 헷갈려한다.

 

그럼 인코딩과 암호화는 도대체 어떤 차이가 있는 걸까?

 

 

인코딩과 암호화의 차이

인코딩과 암호화의 가장 결정적인 차이는 `인코딩`은 누가 못알아보게 만들려는 처리가 아니라 사용성을 좋게하기 위한 가공이라는 것이다.

반대로 `암호화`는 누가 못알아보게 만들려는 처리가 그 목적이다.

 

아래 표는 인코딩과 암호화의 차이를 간략하게 정리한 표다.

구분 인코딩(Encoding) 암호화(Encryption)
목적 데이터를 특정 포맷이나 형식으로 변환하여
저장, 전송 등의 용이성을 높이기 위함.
데이터를 보호하여 허락되지 않은 사용자가
정보를 이해할 수 없도록 함.
키 사용 유무 일반적으로 키가 필요하지 않음. 데이터를 암호화하고 해독하기 위해 키가 필요함.
변환 방법 Base64, URL Encoding 등  대칭키 암호화(AES 등), 비대칭키 암호화(RSA 등) 등
목표 사용자 누구나 인코딩된 데이터를 디코딩할 수 있음. 오직 키를 가진 사용자만이
암호화된 데이터를 복호화할 수 있음.
보안성 보안을 목적으로 하지 않음.
데이터의 사용 편의성과 호환성을 목적으로 함.
데이터 보안을 목적으로 함.
비인가 접근으로부터 정보를 보호함.
예시 HTML Entity, MIME Encoding HTTPS 통신, 파일 암호화

 

자세한 내용에 대해 알아보자

 

인코딩/디코딩

인코딩/디코딩이란?

`인코딩`은 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정이다.

디코딩은 인코딩을 반대로 진행한 결과이다.

 

인코딩의 목적

`인코딩의 주된 목적`은 데이터의 저장, 전송 및 처리를 용이하게 하는 것이다.

앞서 이미 설명했듯 `인코딩`은 누가 못알아보게 만들려는 처리가 아니라 사용성을 좋게하기 위한 가공이다.

단순하게 사용성을 좋게하기 위한 가공일뿐이라서 인코딩한 값은 당장은 알아볼 수 없을지언정, 디코딩해서 원래대로 되돌린다면 알아보기가 쉽다. 더군다나 누구던지 인코딩/디코딩 알고리즘에 따라 데이터만 변환하면 되니 인코딩한 값을 누구라도 볼 수 있다.

- 호환성 확보

서로 다른 시스템이나 소프트웨어 간의 데이터 호환성을 확보하기 위해 사용된다.

예를 들어, `문자 인코딩 시스템인 UTF-8`은 다양한 언어를 지원하여 전 세계적으로 통용될 수 있도록 돕는다.

 

- 데이터 손실 방지

데이터를 안전하게 저장하거나 전송하기 위해 특정 형식으로 인코딩한다.

이는 데이터가 시스템 간에 이동할 때 발생할 수 있는 손상을 최소화하는 데 도움이 된다.

 

- 사용성 증대

데이터를 더 효율적으로 저장하거나 전송하기 위해 인코딩을 사용한다.

예를 들어, `이미지나 비디오 데이터`를 압축하여 저장 공간을 절약하고, 전송 시간을 단축할 수 있다.

 

- 응용 프로그램 요구 사항 충족

`특정 응용 프로그램이나 프로토콜에서 요구하는 데이터 형식`을 맞추기 위해 인코딩이 필요하다.

예를 들어, 웹 페이지에서 HTML 문서는 특정 문자를 HTML 엔티티로 인코딩하여 안전하게 전송하고, 올바르게 표시되도록 한다.

 

이처럼 인코딩은 데이터를 보다 효율적이고 호환 가능하며 안전하게 처리하기 위한 필수적인 단계이다.

데이터의 원활한 처리와 전송을 보장하는 기술적 해결책으로서의 역할을 한다.

 

Base64 알고리즘

Base64 알고리즘 이외에도 ASCII, Unicode, URL Encoding, UTF-8 등 여러 인코딩 알고리즘이 존재한다.

하지만 여기에서는 Base64 알고리즘에 대해 알아보도록 하자.

 

base64 encoding 기법은 실생활에서도 정말 많이 사용되는 encoding 기법 중 하나이다.

Base64라는 말을 그대로 직역하면 64진법이라는 뜻이다.

 

그리고 아래와 같은 형태로 치환이 된다.

문자열 => ASCII Binary로 바꿈 => 6bit씩 자름 => base64로 encoding

6bit씩 자를 때 부족한 부분은 0을 채우게 됨

 

위 예시도 Base64 알고리즘으로 인코딩한 결과이다.

Java 언어로 인코딩을 진행한 결과값 출력

 

 

Base64로 'a'를 인코딩 하는 과정을 알아보자.

1. 문자열을 이진 데이터로 변환

- 인코딩하려는 문자열 "a"를 이진 형식으로 변환

- ASCII 테이블에 따르면, 문자 'a'는 10진수로 97

- 이를 이진수로 변환하면 01100001이 됨

2. 이진 데이터를 6비트 단위로 나누기

- Base64 인코딩은 데이터를 6비트 단위로 나누어 처리

- "a"의 이진 표현 01100001은 이미 8비트로 되어 있으므로, 이를 그대로 사용할 수 있음

- 하지만 Base64는 6비트 단위로 데이터를 나누기 때문에, 8비트를 6비트와 2비트로 나눔

- 첫 번째 6비트: 011000
- 나머지 2비트: 01

 

3. 나머지 비트 처리
- Base64 인코딩은 항상 6비트 단위로 처리해야 하기 때문에, 나머지 2비트에 추가 비트를 붙여 총 6비트를 맞춰줌

- 남은 2비트 01에 4개의 비트(0000)를 추가하여 010000을 만듭니다.

4. Base64 문자로 변환

- 각 6비트 값은 Base64 테이블의 인덱스에 해당하고, 이 인덱스를 사용해 Base64 문자를 결정함

- 011000 → 24번째 인덱스 → Base64 문자 'Y'
- 010000 → 16번째 인덱스 → Base64 문자 'Q'

 

5. 패딩 추가
- Base64 인코딩된 문자열은 항상 4의 배수 길이를 가져야 함

- 현재 'YQ'는 두 문자로 되어 있기 때문에, 두 개의 '=' 문자를 추가하여 길이를 4로 맞춤

 

위 순서를 역으로 진행해 원래 문자로 돌리는 과정이 디코딩이다.

실제로 자바스크립트 명령어로 base64 인코딩을 진행하면 위와 같은 결과값이 도출됨

 

 

여기서 질문!

Q. 그럼 왜 굳이 64라는 숫자를 선택했을까?

A. ASCII문자들을 모두 표현할 수 있는 가장 작은 진법이기 때문이다.

 

Q. 아스키 문자는 128개 아닌가??

A. 맞다. 하지만 여기서는 아래 표처럼 제어문자는 포함시키지 않고, 대/소문자와 숫자만 포함한다.

ASCII 문자

 

일단 base64는 사용하는 64개의 문자에 따라 다양한 변종이 있다. 여기서는 그 중 가장 보편적으로 쓰이는 것으로 확인해보자.

참고로 추가하자면, 보통 처음 62개는 [A-Za-z0-9]를 사용하며, 마지막 2개에 따라 달라지는 방식이다.

 

암호화/복호화

암호화/복호화는 인코딩과는 반대로 사용성의 개선보다는 제3자가 내가 보내는 데이터의 내용을 알아볼 수 없게 하기 위한 처리다.암호화는 크게 두 가지 종류로 나뉜다.

 

암호화의 종류

단방향 암호화

`단방향 암호화`란 암호화만 가능하고 복호화가 불가능한 암호화 방식을 말한다. 

일반적으로 해시함수를 많이 이용한다.

 


예시

유저들의 비밀번호

유저들의 비밀번호를 단방향 암호화 하는 이유

- 보안성이 좋음

- 우리나라의 경우 법으로 강제됨: 비밀번호 등의 민감한 정보는 반드시 단방향 암호화를 통해 저장해야 함
    - 복호화가 불가능하다는 특징 덕분에 각종 비밀번호같이 유출사고가 일어나도 남이 알아볼 수 없어야 하기 때문

 

하지만 완벽한 보안은 아님
- `레인보우 테이블`이라는 일종의 브루트 포스나 다름없는 존재 때문
- `레인보우 테이블`이란 해시함수를 통해 변환될 수 있는 모든 해시값을 저장해놓은 표

     - 설명만 들어도 대단히 무식하면서도 확실할 것 같은 포스를 풍긴다

     - 레인보우 테이블 때문에 실제로 해시값을 그대로 쓰는 경우는 없고

       보통은 원래의 평문에다 소금(salt)이라 불리는 추가 데이터를 붙이거나,

       여러번 해시함수를 통하게 만드는 등의 방법을 써서 레인보우 테이블을 무력화 시키는 방법을 쓴다

물론 이런 처리 방법만 믿고 유추하기 쉬운 비밀번호를 썼다가는 각종 암호화처리 과정이 무색하게 손쉽게 해커에게 계정을 탈취당하는 불상사가 벌어질 수도 있으니 비밀번호는 어려운 것을 쓰도록 하자.

어디까지나 레인보우 테이블이란 수단을 무력화 시킬 수 있을 뿐이지 진짜 브루트 포스 앞에서는 답이 없다. 

특히 브루트 포스 공격 시 쉬운 비밀번호 부터 대입해본다는 사실을 생각하면 더더욱 그렇다.

 

양방향 암호화

`양방향 암호화`는 단방향 암호화와 달리 암호화와 복호화가 모두 가능한 방식을 말한다


그렇기 때문에 기본적으로 암호화와 복호화하는 과정에 `키(Key)`라 불리는 특수한 데이터가 필요하며, 이 키를 가지고 있지 않으면 해당 암호의 평문을 볼 수가 없다.


우리가 생각하는 아주 일반적인 방식의 암호화로 특정 키 값을 가지고 암호화 알고리즘에 따라 암호화 한 뒤, 

키를 가진 사람이 복호화 알고리즘에 따라 복호화하여 암호화하기 전의 평문을 볼 수 있다.

 


여러 정보들이 양방향 암호화 알고리즘을 통해 암호화되는데 이 양방향 암호화도 두 가지로 나누어진다.

1) 대칭 암호화 알고리즘

`대칭 암호화 알고리즘`이란 암호화와 복호화에 쓰이는 키가 같은 암호화 알고리즘을 말한다.

송신자가 특정 키 값으로 평문을 암호화해서 보내면 수신자 역시 같은 키 값으로 복호화해서 평문을 볼 수 있다

 

알고리즘 예시

AES(Advanced Encryption Standard), DES(Data Encryption Standard), Blowfish 등

장점
대칭키 암호화 알고리즘은 암호화/복호화에 쓰이는 키가 동일하고, 키 값의 사이즈가 작아 

연산량이 적고 빠르게 암호화/복호화가 진행된다

 

단점

하지만 암호화/복호화에 쓰이는 키 값이 같은 만큼 키를 중간에 탈취당하거나, 

브루트 포스 등의 방법으로 공격자가 키 값을 알아내게 될 경우 별 다른 수 없이 평문이 노출되게 되어 보안에 취약하다

대칭 암호화 알고리즘이 주로 사용되는 경우

대량 데이터 처리, 내부 통신 보안, 스트리밍 서비스 등

 

 

2) 비대칭 암호화 알고리즘

`비대칭 암호화 알고리즘`이란 암호화와 복호화에 쓰이는 키가 다른 암호화 알고리즘을 말한다. 

 

비대칭 암호화 알고리즘에선 일반적으로 두 가지 키를 사용한다.

- `공개키`: 누구나 사용가능한 키

- `개인키`: 특정 사용자만이 보유하고 있는 키

 

일반적으로 송신자는 누구에게나 개방된 공개키를 이용해 암호화를 진행하고

수신자는 자신이 가진 개인키를 이용해 복호화를 진행해 평문을 볼 수 있다.

물론 일반적으로 그렇다는 것이고, 실제로는 개인키로 암호화해서 공개키로 복호화할 수 있는 등 딱히 정해진 제약이 존재하진 않는다.

물론 공개키로 암호화해서 공개키로 복화하는 등의 행위는 불가능하다.

 

알고리즘 예시

RSA (Rivest-Shamir-Adleman), ECC (Elliptic Curve Cryptography), Diffie-Hellman 키 교환 등

 

장점
비대칭 암호화 알고리즘은 암호화와 복호화에 쓰이는 키가 다른 만큼 제3자가 공개키를 알고 있더라도 

이를 복호화하기 위한 개인키를 알아내기는 쉽지 않아 보안성이 좋다

 

단점
하지만 반대급부로 공개키와 개인키의 사이즈가 커서 데이터양이 많아지고,

해당 암호화 방식 자체가 연산량이 많기 때문에 속도가 느리다

 

비대칭 암호화 알고리즘이 주로 사용되는 경우

HTTPS에 사용되는 SSL/TLS, 디지털 서명 등

 

 

 


참고

https://velog.io/@wksh229/%EC%9D%B8%EC%BD%94%EB%94%A9-%EB%94%94%EC%BD%94%EB%94%A9%EA%B3%BC-%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94

 

인코딩 디코딩과 암호화 복호화

프로그램을 짜다보면 인코딩/디코딩과 암호화/복호화를 할 일이 매우 많다근데 우리 눈으로 보기에는 AzmS192Mdks01Aakd9xl1와 같이 알아보지도 못할 이상한 문자열만 잔뜩 늘어서 있는 것 처럼 보여

velog.io

https://youreamazing.tistory.com/79

 

#20200306 인코딩 vs 암호화

$ 인코딩 vs 암호화 주제로 블로그를 작성하는 이유? 암호화에 대해서 발표를 하던 중 암호화 시스템의 등장에 대한 배경으로 아날로그 데이터를 디지털 부호로 변환하는 바꾸는 것을 부호화(enco

youreamazing.tistory.com

https://dokhakdubini.tistory.com/505

 

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

base64 encoding 알아보기 (좀 필요 이상으로 많이) 1. 개요 base64 encoding 기법은 CTF부터 시작해서 실생활에서도 정말 많이 사용되는 encoding 기법 중 하나입니다. 사실 현실은 온라인으로도 툴이 너무

dokhakdubini.tistory.com

https://minhanpark.github.io/today-i-learned/ascii-and-base64/

 

base64 인코딩을 사용하는 이유

base64는 무엇인 지 base64 인코딩을 사용하는 이유는 무엇인 지 알아본다.

minhanpark.github.io

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