개발관련/암호화 2009. 12. 31. 15:41

그동안 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=

posted by 제스트
: