본문 바로가기

Language/Java / JSP

[Java] Base64 암호화, 복호화 방법

반응형

컴퓨터 분야에서 쓰이는 Base 64 (베이스 육십사)란 8비트 바이너리 데이터(예를 들어 실행파일이나, ZIP파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 스트링으로 바꾸는 인코딩 방식을 가리키는 개념이다.


원래 Base 64를 글자 그대로 번역하여 보면 64진법이란 뜻이다. 특별히 64진법이 컴퓨터에서 흥미로운 것은, 64가 2의 제곱수(64 = 26)이며, 2의 제곱수들에 기반한 진법들 중에서 화면에 표시가 되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법이기 때문이다. 즉 다음 제곱수인 128진법에는 128개의 기호가 필요한데 화면에 표시되는 ASCII 문자들은 128개가 되지 않는다.

그런 이유 때문에 이 인코딩은 이메일을 통한 바이너리 데이터 전송 등에 많이 쓰이고 있다. Base 64에는 어떤 문자와 기호를 쓰느냐에 따라 여러 변종이 있지만, 잘 알려진 것은 모두 처음 62개는 알파벳 A-Z, a-z와 0-9를 사용하고 있으며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있다.

데이터를 Base64로 인코딩 하는 방법은 다음과 같다. 우선 24비트 버퍼에 위쪽(MSB)부터 한 바이트씩 세 바이트를 집어넣는다. 그리고 남은 바이트가 3바이트 미만이라면, 버퍼의 남은 부분은 0으로 채워넣게 된다.


그리고, 버퍼의 위쪽부터 6비트씩 잘라 그 값을 읽어, 다음에 정렬된 64개 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"의 문자 중에서 읽은 값 번째 문자를 골라 출력한다.


만약 입력된 바이트가 하나라면 출력 중 두 개만이 사용되고 나머지 둘은 "="으로 패딩되며, 입력된 바이트가 둘이라면 출력 중 세 개 만이 사용되고 나머지 하나는 "="으로 패딩되게 된다.


이것은 원본으로 되돌릴 때 원본에는 없던 비트가 생기는 것을 방지하기 위함이다. 이 과정은 입력 데이터가 끝날 때까지 반복하면 인코딩이 된다.

[출처 : 위키백과]




[Base64 Encoding 색인 테이블]



결국은 데이터에 해당하는 문자열을 처음부터 아스키 코드표에서 찾고, 이를 2진수로 변환한다음에 6비트씩 자른뒤 base64 색인표에서 해당하는 index를 찾아 변경되는 문자열을 작성하면 된다라는 소리인가? 내가 제대로 이해했는지 모르겠다.

그렇다면 Java에서는 어떻게 구현할까? 위 말대로 데이터를 아스키로 변환하고 base64 색인표를 검색하고.. 또...?
이 부분에 대해선 걱정하지 않아도 된다.


Base64 인코딩, 디코딩을 java에서 기본으로 지원할 뿐만 아니라, apache 재단에서 관련 라이브러리도 제공해 준다.


아래 Base64 인코딩, 디코딩 샘플은 Java 기본 라이브러리인 sun.misc를 사용하여 작성하였다.



[Base64 암호화, 복호화 소스]

import java.io.IOException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


public class Base64Tester {

	public static void main(String[] args) {

		BASE64Encoder base64Encoder = new BASE64Encoder();
		BASE64Decoder base64Decoder = new BASE64Decoder();

		String txt = "과일가게 개발자의 개발이야기";
		
		
		
		System.out.println("source : " + txt);

		
		// Base64 인코딩
		String base64Txt = base64Encoder.encode(txt.getBytes());

		System.out.println("Base64 Encode : " + base64Txt);

		try {
			
			// Base64 디코딩
			txt = new String(base64Decoder.decodeBuffer(base64Txt));
			
			System.out.println("Base64 Decode : " + txt);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}