티스토리 뷰
Base64 는 기본적인 인코딩 방식중 하나라고 볼 수 있다.
바이너리 데이터들을 인코딩할 때도 많이 쓰이는데
보통 메일에서 이미지나 실행파일들을 Base64 형태로 보내기도 한다.
여기서 64는 64진법을 사용한다는 뜻인데 위키백과 기준으로 아래와 같은 값들과 매칭된다
아래에서 0~61 까지 (A-Z, a-z, 0-9) 는 동일하고 그 뒤에 두개의 기호는 구현하는데에 따라 다를수 있음.
Base64의 인코딩 원리는
1. 문자열을 bit 형태로 변형한다.
2. 6개의 bit씩 나눈다
3. 각각 위 테이블에 매칭되는 값으로 바꾼다
6개 bit로 자르는 이유는 6개의 비트면 조합이 64개이므로 (2^6)
GODD 를 Base64 로 인코딩 한다고 하면 아래와 같이 나온다.
1. 문자열을 bit 형태로 변형한다.
G O D D
01000111 01001111 01000100 01000100
2. 6개의 bit씩 나눈다
010001 / 110100 / 111101 / 000100 / 010001 / 00
17 / 52 / 61 / 4 / 17 / 나머지
3. 각각 위 테이블에 매칭되는 값으로 바꾼다
앞에 17, 52, 61, 4, 17에 해당하는 R, 0, 9, E, R 로 인코딩이 된다.
나머지 두 비트는 0으로 채워서 000000 => 0 => A 로 인코딩
따라서 R09ERA 로 인코딩 된다.
여기서 디코딩을 위해 패딩 개수를 알려주기 위해 패딩값 ==을 추가하여 최종적으로
R09ERA== 라는 값이 나온다.
(디코딩 할 때 ==를 보고 4 bit를 지우고 시작, = 한개면 2 bit 지우고 시작)
여기서 문제는 나머지 bit 처리인데
바이트가 8bit로 이루어져 있고 6bit 씩 잘라서 쓰므로 아래처럼 남게 된다.
1글자 = 1 byte = 8 bit => 6 bit 사용 / 2 bit 남음
2글자 = 2 byte = 16 bit => 12 bit 사용 / 4 bit 남음
3글자 = 3 byte = 24 bit => 24 bit 사용
4글자 = 4 byte = 32 bit => 30 bit 사용 / 2bit 남음
...
이렇게 2 bit, 4 bit 씩 남는 경우가 있다.
이 경우 6 bit로 맞추기 위해 padding 값을 0으로 채워주게 된다.
여기서 또 문제!
디코딩 할 때도 반대로 똑같이 처리를 해줘야 하는데
0으로 padding 할 경우 잘못된 값으로 디코딩 될 우려가 있어
위처럼 2bit가 남으면 뒤에 == 추가, 4bit 가 남으면 뒤에 = 를 추가한다.
(Base64 인코딩 해보신 분들은 알겠지만 == 이런게 자주 붙어나옴)
[출처] 위키백과: https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464
'Architecture > Security' 카테고리의 다른 글
[블록체인] Proof of Stake (PoS) 란? (0) | 2021.06.23 |
---|---|
[암호학] 공개키 암호 방식과 전자서명 (0) | 2021.05.31 |
[암호화] 양방향/단방향 암호화 (0) | 2019.12.02 |
OAUTH (0) | 2019.06.12 |
- Total
- Today
- Yesterday
- 카르다노
- 사토시 나가모토
- Redis
- Vue.js
- k8s
- Java
- 백준
- 알고리즘
- CARDANO
- 블록체인
- leetcode
- DP
- kubernetes
- 스프링
- 아키텍처
- Bruteforce
- Nealford
- Spring
- architecture
- SpringBoot
- white paper
- excel parsing
- 암호화폐
- 동적계획법
- 비트코인
- 스프링 시큐리티
- Blockchain
- gRPC
- Bitcoin
- vuejs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |