2012년 4월 24일

DES 암호화

DES

데이터 암호화 표준 (Data Encryption Standard, 이하 DES)는 1977년 미국 정부 표준으로,  1981년에 ANSI 표준으로 체택되었다.DES는 파이스텔의 네트워크(Feistel Network)라 알려진 개념을 바탕으로 하며, 56비트 길이의 키를 사용하고, 사용목적에 따라 다양한 작동 모드를 제공하는 암호방식이다. 비록 DES 가 강력한 암호화 알고리즘이기는 하지만, 짧은 키 길이 때문에 오늘날에는 사용이 제안되고 있다. 

1998년에 전자 프런티어 재단( Electronic Frontier Foundation, 이하 EFF) 는 25 만 달러를 투자하여 DES 를 깨기위한 특수 목적의 기계를 만들었다. EFF 는  전세계 컴퓨터 사용자들의 협동작업으로 DES로 암호화된 메시지를 하루 안에 깰수 있음을 단 한번의 공개 실험으로 입증했다.  


삼중 DES

삼중 DES(Triple-DES)는 세 개의 다른 키를 사용하고 DES 알고리즘을 세 번 적용하여(총 길이가 168비트), DES를 더욱 안전하게 만드는 방법이다. 3DES 라고도 하는 이 알고리즘은 금융기관과 보안 웹 프로그램 (SSH) 등에서 광범위하게 사용하고 있다. 그러나 단순히 DES를 두개의 다른 키로 두번 적용하는 것만으로는 예상한 만큼 보안을 현저히 증가시킬수 없다. 왜냐하면 '중간에서 맞추기(meet-in-middle)' 방식을 사용하면 이론적으로 이중 암호화를 깰 수 있기 때문이다. '중간에서 맞추기' 란 한 쪽에서는 일반 텍스트를 단일 DES 알고리즘으로 암호화하고, 동시에 다른 쪽에서는 암호화된 메시지를 DES 알고리즘으로 해독하여 두 결과가 서로 일치할 때 까지 시도하는 방식이다. 

DES 암호화 사용하기 

package architecture.common;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;

import sun.misc.BASE64Decoder;

public class DESTest {

 private Log log = LogFactory.getLog(getClass());
 
 public static Key generateKey(String algorithm) throws NoSuchAlgorithmException {

  KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
  SecretKey key = keyGenerator.generateKey();
  return key;

 }

 @Test
 public void testDES() {
  
  Key key = null;
  String enc = null;
  
  try {
   
   // STEP1 : 키 생성
   key = generateKey("DES");
   
   // SETP2 : 암호화 모듈 준비
   Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
   cipher.init(Cipher.ENCRYPT_MODE, key);
      byte stringBytes[] = "hello".getBytes();
      
      // STEP 3 : 암호화
         byte raw[] = cipher.doFinal(stringBytes);
         enc = Hex.encodeHexString(raw);
         log.debug("ENC:" + enc );
         
  } catch (Exception e) {
   log.error(e);
  }

  try {
   
   // STEP 4 : 암호화 모듈 준비
   SecretKeySpec skeySpec = new SecretKeySpec(key.getEncoded(), "DES");
   Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
   cipher.init(Cipher.DECRYPT_MODE, skeySpec);

   // STEP5 : 복호화
         byte raw[] = Hex.decodeHex(enc.toCharArray());
         byte stringBytes[] = cipher.doFinal(raw);
         
         log.debug("DEC:" + new String(stringBytes));
   
  } catch (Exception e) {
   log.error(e);
  } 
 }
}
참조.
Web Security, Privacy & Commerce, 2nd ed, 

댓글 없음:

댓글 쓰기