베이스가 64라는 것은 모든 정보를 64진수로 표시한다는 것인데, 컴퓨터는 2진수를 사용하므로 64진수로 표시하기 위해서는
2^6 = 64 즉 6 비트 2진수 열이 필요하다.
그런데 대개 컴퓨터에서 가장 기본이 되는 정보 단위는 8 비트씩 엮어진 바이트이므로
6비트와 8비트가 각각 나누어 떨어질 수 있는 공배수의 최소값 (최소 공배수)를 구하면 24비트가 된다.
24비트는 8비트 바이트에서는 3바이트가 되고, 64진수로 나타내기 위한 6비트 단위로는 4 단위가 된다. (바이트라고 반복하기 말하면 혼동이 될 것 같아서 "단위"라는 말로 대치하였다.)
따라서 Base64의 인코딩 원리는 3바이트 단위마다 (즉 24비트 마다) 6비트씩 쪼개어서 6비트 짜리 문자 4개로 만드는 것이 되겠다.
이 때 6비트씩 쪼개진 단위를 A-Z a-z 0-9 +- (모두 64개 문자)로 각각 대응시키면 Base64 인코딩이 된다.
Base64 Encoding/Decoding
그런데 입력되는 정보가 모두 3바이트씩 떨어진다는 보장이 없으므로 3바이트로 나누어떨어지지 않는 경우 = 문자로 채우기를 한다. 즉 Base64로 인코딩 된 데이타에서 = 가 보이면 그 것은 다시 원래의 정보로 되돌아 갈때 (디코딩 될때) 아무 것도 없는 것이라는 소리가 된다.
(Base64로 인코딩 정보의 끝에 최대 나올 수 있는 = 의 수는 2개가 되겠다. 즉 끝부분에 =가 없거나 1개가 있거나 2개가 있는 것이 모두 나올 수 있는 경우가 되겠다.)
디코딩은 A-Z a-z 0-9 +- 문자를 각각 6비트의 정보로 바꾸어서 4 단위 (6*4=24 비트) 마다 합쳐서 3바이트 (3*8=24 비트) 로 다시 복원시키면 된다.
이러한 2진수 데이터를 64진수형으로 변환하여 64개의 아스키 코드에 대입하는것이 Base64 알고리즘의 기본이다. 또한 이런 변환을 하는 이유는 암호화에도 있겠지만 보통은 안전한 64개의 아스키문자열로 변환하여 원할한 데이터를 전송하는데 있다. 예를 들자면 한국어의 경우 2바이트 문자열로 그대로 전송할시 문자열의 깨짐이 발생 할 수 있다. 이는 데이터 전송시 원하지 않는 결과이며 이러한것을 막기 위해 안전한 아스키코드 문자로 변환하여 전송 하는것이다. 보통 이러한 Base64인코딩 디코딩은 이메일 전송시 많이 사용된다. 하지만 데이터가 기존의 데이터보다 약 30%이상 커진다는 단점이 있다.
그럼 일반 문자열을 Base64로 인코딩은 어떻게 하면 될까? 답은 다음의 스텝대로 시도하면 된다.
- 소스의 바이너리 데이타로 부터 3바이트씩 꺼낸다. 만약 나머지 소스 문자열이 3바이트가 되지 않는다면 0으로 채운다.
- 최초 바이트의 MSB를 6비트씩 4개의 숫자로
- 각각의 수치를 하단의 표를 토대로 아스키 문자로 변환한다. 다만 실제의 데이터 길이가 3바이트에 미치지 못한다면 '='로 대체 한다.
- 이후 데이터가 없어질때까지 1~3을 반복한다.
'프로그래밍 > Security, Network' 카테고리의 다른 글
외부에서 집 컴퓨터 연결 방법 - 원격 데스크톱 이용 (0) | 2017.12.28 |
---|---|
클라우드 컴퓨팅(Cloud Computing)이란 (0) | 2017.12.25 |
악성코드가 이용하는 Windows Registry (0) | 2017.12.04 |
레지스트리 포렌식과 보안 [김진국].pdf (0) | 2017.12.01 |