2011. 3. 11. 14:21


package com.newkie;

import java.security.SecureRandom;

import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.SecretKeySpec;

public class AESCrypto
{
 private static AESCrypto instance = null;
 public static AESCrypto getInstance()
 {
  if(instance == null)
  {
   instance = new AESCrypto();
  }
  return instance;
 }
 
 public String encrypt(String masterPassword, String clearText)
 throws Exception
 {
  byte[] rawKey = getRawKey(masterPassword.getBytes());
  byte[] result = encrypt(rawKey, clearText.getBytes());
  return toHex(result);
 }
 
 public String decrypt(String masterPassword, String encrypted)
 throws Exception
 {
  byte[] rawKey = getRawKey(masterPassword.getBytes());
  byte[] enc = toByte(encrypted);
  byte[] result = decrypt(rawKey, enc);
  return new String(result);
 }

 private byte[] getRawKey(byte[] seed)
 throws Exception
 {
  KeyGenerator kgen = KeyGenerator.getInstance("AES");
  SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
  sr.setSeed(seed);
     kgen.init(128, sr);
     SecretKey skey = kgen.generateKey();
     return skey.getEncoded();
 }
 
 private byte[] encrypt(byte[] raw, byte[] clear)
 throws Exception
 {
     SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  Cipher cipher = Cipher.getInstance("AES");
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
     byte[] encrypted = cipher.doFinal(clear);
  return encrypted;
 }

 private byte[] decrypt(byte[] raw, byte[] encrypted)
 throws Exception
 {
     SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  Cipher cipher = Cipher.getInstance("AES");
     cipher.init(Cipher.DECRYPT_MODE, skeySpec);
     byte[] decrypted = cipher.doFinal(encrypted);
  return decrypted;
 }
 
 public byte[] toByte(String hexString)
 {
  int len = hexString.length()/2;
  byte[] result = new byte[len];
  for (int i = 0; i < len; i++)
  {
   result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16)
     .byteValue();
  }
  return result;
 }

 public String toHex(byte[] buf)
 {
  if (buf == null || buf.length == 0)
  {
   return "";
  }
  StringBuffer result = new StringBuffer(2*buf.length);
  
  for (int i = 0; i < buf.length; i++)
  {
   appendHex(result, buf[i]);
  }
  return result.toString();
 }
 
 private final static String HEX = "0123456789ABCDEF";
 private void appendHex(StringBuffer sb, byte b)
 {
  sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
 }
}





AESCrypto ae = new AESCrypto.getInstance();
ae.encrypt(newkie,pw);//암호화

ae.decrypt(newkie,pw);//복호화

'자바' 카테고리의 다른 글

돈에 ,찍기나 전화번호에 -찍는 등의 정규식.  (0) 2011.04.21
JSON 배열 만들고 파싱하기  (2) 2011.04.12
배열정렬 Comparator  (1) 2011.03.31
간단한 쓰레드 예제  (0) 2011.03.11
Posted by newkie