그동안 base64, 해쉬 알고리즘 및 활용에 대해서 알아 보았다.
지금부터 본격적으로 암호화에 대한 이야기를 하고자 한다.
암호화는 크게
1) KEY 없는 암호화: 단 이 경우 암호화만 가능하고 복호화는 불가능하다.
2) 하나의 KEY로 암호화 : 하나의 KEY로 암호화된 데이터는 바로 그 키로 복호화된다.
3) 두개의 KEY로 암호화 : KEY가 두개다. 즉 KEY1으로 암호화된 데이터는 KEY2로만 복호화된다.
대칭키 암호화는 2)에 해당된다. 즉 하나의 KEY로만 암복호화가 가능하다.
대칭키 암호화 알고리즘은 보안의 세계에서 가장 보편적으로 사용하는 기법이다.
대칭키 암호화 알고리즘으로 잘 알려진 것들은 DES(Triple DES), AES, Blowfish, RC4 등이 있고
국내에서는 SEED를 민간기관 표준 알고리즘으로 사용하고 있다. 특수한 경우를 제외하고는 각 암호화 알고리즘은
공개되어 있으며 누구나 표준에 따라 구현할 수 있다.
그 동안 자바로 암호화를 구현할 경우 국내 표준 알고리즘이 제외되었기 때문에 구현에 어려움이 있었으나
최근에 SEED가 국제표준화되면서 OPEN 소스에서도 이를 지원하고 있다.
일단 기본적인 암호화 지식을 무시고하고 아래의 소스부터 보자
import org.bouncycastle.crypto.engines.SEEDEngine;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Base64;
(중략)
//암호화에 사용될 키
byte[] key = {(byte)0x01,(byte)0x02,(byte)0x03,(byte)0x04,(byte)0x05,(byte)0x06,(byte)0x07,(byte)0x08,
(byte)0x09,(byte)0x10,(byte)0x11,(byte)0x12,(byte)0x13,(byte)0x14,(byte)0x15,(byte)0x16};
//암호화할 데이터
byte[] data = "12345대한민국".getBytes();
//SEED로 암호화할 것을 선언
PaddedBufferedBlockCipher blockcipher = new PaddedBufferedBlockCipher(new SEEDEngine());
//초기화 및 키 파라메터 생성 true는 암호화한다는 의미 false인 경우 복호화
blockcipher.init(true, new KeyParameter(key));
//암호화 프로세스 추가
int len =0;
byte[] tmp = new byte[blockcipher.getOutputSize(data.length)];
len =blockcipher.processBytes(data, 0, data.length, tmp, 0);
try {
len+=blockcipher.doFinal(tmp, len);
} catch (Exception e) {
throw new Exception("암호화 오류가 발생하였습니다.올바른 키로 암호화하였는지 확인하십시오");
}
//암호화된 결과를 담을 버퍼
byte[] out = new byte[len];
System.arraycopy(tmp, 0, out, 0, len);
System.out.println("암호화된 데이터의 길이 ="+out.length);
System.out.println(new String(Base64.encode(out)));
}
//복호화 프로세스 시작
blockcipher.init(false, new KeyParameter(key));
int len2 =0;
byte[] tmp2 = new byte[blockcipher.getOutputSize(out.length)];
len =blockcipher.processBytes(out, 0, out.length, tmp2, 0);
try {
len2+=blockcipher.doFinal(tmp2, len2);
} catch (Exception e) {
throw new Exception("복호화 오류가 발생하였습니다.올바른 키로 복호화하였는지 확인하십시오");
}
//복호화된 데이터를 담을 버퍼
byte[] out2= new byte[len2];
System.arraycopy(tmp2, 0, out2, 0, len2);
System.out.println("복호화된 데이터의 길이 ="+out2.length);
System.out.println(new String(out2));
이상의 소스를 잘 정리하면 SEED 알고리즘을 이용한 암복호화 함수가 완성될 것이다.
이에 대한 부가 설명은 다음편에 계속하겠다.
스크랩:http://blog.paran.com/blog/detail/postBoard.kth?blogDataId=28578038&pmcId=javacipher&totalCount=13&preViewPage=0&ajaxPage=1&preFBlogId=35385570&preLBlogId=27788506&pageStyle=null&myCateId=0&yearMonth=null&rDay=null&style=Board&p_eye=