Triple DES Security Java 소스이다.
다른 소스와 다른 점은 NoSuchAlgorithm이 날 경우에 SunJCE를 설치하여 Exception을 없앤 소스라는 것...


/*

 * Copyright (c) 2000 David Flanagan.  All rights reserved.
 * This code is from the book Java Examples in a Nutshell, 2nd Edition.
 * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
 * You may study, use, and modify it for any non-commercial purpose.
 * You may distribute it non-commercially as long as you retain this notice.
 * For a commercial use license, or to purchase the book (recommended),
 * visit http://www.davidflanagan.com/javaexamples2.
 */

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;

/**
 * This class defines methods for encrypting and decrypting using the Triple DES
 * algorithm and for generating, reading and writing Triple DES keys. It also
 * defines a main() method that allows these methods to be used from the command
 * line.
 */
public class TripleDES {
  /**
   * The program. The first argument must be -e, -d, or -g to encrypt,
   * decrypt, or generate a key. The second argument is the name of a file
   * from which the key is read or to which it is written for -g. The -e and
   * -d arguments cause the program to read from standard input and encrypt or
   * decrypt to standard output.
   */
  public static void main(String[] args) {
    try {
      // Check to see whether there is a provider that can do TripleDES
      // encryption. If not, explicitly install the SunJCE provider.
      try {
        Cipher c = Cipher.getInstance("DESede");
      } catch (Exception e) {
        // An exception here probably means the JCE provider hasn't
        // been permanently installed on this system by listing it
        // in the $JAVA_HOME/jre/lib/security/java.security file.
        // Therefore, we have to install the JCE provider explicitly.
        System.err.println("Installing SunJCE provider.");
        Provider sunjce = new com.sun.crypto.provider.SunJCE();
        Security.addProvider(sunjce);
      }

      // This is where we'll read the key from or write it to
      File keyfile = new File(args[1]);

      // Now check the first arg to see what we're going to do
      if (args[0].equals("-g")) { // Generate a key
        System.out.print("Generating key. This may take some time...");
        System.out.flush();
        SecretKey key = generateKey();
        writeKey(key, keyfile);
        System.out.println("done.");
        System.out.println("Secret key written to " + args[1]
            + ". Protect that file carefully!");
      } else if (args[0].equals("-e")) { // Encrypt stdin to stdout
        SecretKey key = readKey(keyfile);
        encrypt(key, System.in, System.out);
      } else if (args[0].equals("-d")) { // Decrypt stdin to stdout
        SecretKey key = readKey(keyfile);
        decrypt(key, System.in, System.out);
      }
    } catch (Exception e) {
      System.err.println(e);
      System.err.println("Usage: java " + TripleDES.class.getName()
          + " -d|-e|-g <keyfile>");
    }
  }

  /** Generate a secret TripleDES encryption/decryption key */
  public static SecretKey generateKey() throws NoSuchAlgorithmException {
    // Get a key generator for Triple DES (a.k.a DESede)
    KeyGenerator keygen = KeyGenerator.getInstance("DESede");
    // Use it to generate a key
    return keygen.generateKey();
  }

  /** Save the specified TripleDES SecretKey to the specified file */
  public static void writeKey(SecretKey key, File f) throws IOException,
      NoSuchAlgorithmException, InvalidKeySpecException {
    // Convert the secret key to an array of bytes like this
    SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
    DESedeKeySpec keyspec = (DESedeKeySpec) keyfactory.getKeySpec(key,
        DESedeKeySpec.class);
    byte[] rawkey = keyspec.getKey();

    // Write the raw key to the file
    FileOutputStream out = new FileOutputStream(f);
    out.write(rawkey);
    out.close();
  }

  /** Read a TripleDES secret key from the specified file */
  public static SecretKey readKey(File f) throws IOException,
      NoSuchAlgorithmException, InvalidKeyException,
      InvalidKeySpecException {
    // Read the raw bytes from the keyfile
    DataInputStream in = new DataInputStream(new FileInputStream(f));
    byte[] rawkey = new byte[(int) f.length()];
    in.readFully(rawkey);
    in.close();

    // Convert the raw bytes to a secret key like this
    DESedeKeySpec keyspec = new DESedeKeySpec(rawkey);
    SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
    SecretKey key = keyfactory.generateSecret(keyspec);
    return key;
  }

  /**
   * Use the specified TripleDES key to encrypt bytes from the input stream
   * and write them to the output stream. This method uses CipherOutputStream
   * to perform the encryption and write bytes at the same time.
   */
  public static void encrypt(SecretKey key, InputStream in, OutputStream out)
      throws NoSuchAlgorithmException, InvalidKeyException,
      NoSuchPaddingException, IOException {
    // Create and initialize the encryption engine
    Cipher cipher = Cipher.getInstance("DESede");
    cipher.init(Cipher.ENCRYPT_MODE, key);

    // Create a special output stream to do the work for us
    CipherOutputStream cos = new CipherOutputStream(out, cipher);

    // Read from the input and write to the encrypting output stream
    byte[] buffer = new byte[2048];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
      cos.write(buffer, 0, bytesRead);
    }
    cos.close();

    // For extra security, don't leave any plaintext hanging around memory.
    java.util.Arrays.fill(buffer, (byte) 0);
  }

  /**
   * Use the specified TripleDES key to decrypt bytes ready from the input
   * stream and write them to the output stream. This method uses uses Cipher
   * directly to show how it can be done without CipherInputStream and
   * CipherOutputStream.
   */
  public static void decrypt(SecretKey key, InputStream in, OutputStream out)
      throws NoSuchAlgorithmException, InvalidKeyException, IOException,
      IllegalBlockSizeException, NoSuchPaddingException,
      BadPaddingException {
    // Create and initialize the decryption engine
    Cipher cipher = Cipher.getInstance("DESede");
    cipher.init(Cipher.DECRYPT_MODE, key);

    // Read bytes, decrypt, and write them out.
    byte[] buffer = new byte[2048];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
      out.write(cipher.update(buffer, 0, bytesRead));
    }

    // Write out the final bunch of decrypted bytes
    out.write(cipher.doFinal());
    out.flush();
  }
}

'Program > Java' 카테고리의 다른 글

Annotation (since tiger / 1.5)  (0) 2009.12.15
XML 파싱  (0) 2009.12.15
아파치 미나  (0) 2009.12.15
알아야 할 용어 정리  (0) 2009.11.30
Stuts2 설정 - struts.properties  (0) 2009.10.09
1. RMI : Remote Method Invocation
Java 환경에서 Computer 간 또는 Program 간에 통신을 할 수 있는 기능을 제공
http://www.javanuri.com/devforum/board.jsp?menuId=13

2. AOP : Aspect Oriented Programming [관점경향]
공통적으로 사용하는 것들에 대한 의존 관계의 복잡성과 코드의 중복을 해소 해 주는 프로그래밍 기법
  - Aspect : 여러 객체에 공통적으로 적용되는 공통 관심사항 [예:트랜잭션이나 보안]
  - Advice: Aspect를 핵심 로직에 적용할지 정의 [예 : 메소드 호출 전에 트랜잭션 시작]
  - Joinpoint : Advice 적용 가능한 지점 [예: 메소드 호출, 필드 값 변경]
  - Pointcut : Joinpoint 의 부분집합. Advice가 적용되는 Joinpoint
  - Weaving : Adivce를 핵심 로직 코드에 적용하는 것

3. DI :  Dependency Injection
의존성 주입
의존(Dependency)에 대한 주입(Injection)을 외부에서 처리하여 주는 것
http://www.sleepyon.com/219

 4. IOC : Inversion of Control
객체에 대한 제어권이 컨테이너에게 넘어가면서 객체의 생명주기를 관리하는 권한 또한 컨테이너들이 전담할 수 밖에 없게 되었다. 이처럼 객체의 생성에서부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 의미하는 것이 제어권의 역전, 즉 Ioc라는 개념
http://wiki.javajigi.net/pages/viewpage.action?pageId=3664

5. ORM : Object-relational mapping [프레임워크]
객체와의 관계를 맵핑시킨다는 일을 함

6. Hiernate
객체를 RDB에 매핑해서 저장하는 ORM(Object-Relational Mapping) Tool
http://wiki.javajigi.net/pages/viewpage.action?pageId=5415

7. DAO : Data Access Objects
실질적인 DB와의 연결을 담당하는 일을 가진 객체

8. MVC : Model, View, Controller [패턴]

9. Beans
jsp에서 객체를 가져다가 사용할 수 있도록 한 기법
기본적으로 데이터를 저장하기 위한, 멤버변수와, 데이터를 컨트롤하는 setter/getter 메소드를 가지고 있는 클래스를 일컫는 말
데이터를 담은 POJO Object

10. POJO : Plain Old Java Object
순수 자바 클래스들을 이르는 말로, 기본 자바 오브젝트를 말함

11. ORM : Object-Relation Mapping
http://www.javajigi.net/pages/viewpage.action?pageId=6560

12. Singleton pattern
heap 영역에 한개만 올려놓고 스택에선 같은 객체를 가르키도록 코딩
클래스의 멤버 변수 공유

13. BeanFactory
빈을 생성하고 소멸시키는 책임을 가진 클래스

14. Decoupling : 디커플링
탈동조화
결합을 약화시킨다

15.

'Program > Java' 카테고리의 다른 글

Annotation (since tiger / 1.5)  (0) 2009.12.15
XML 파싱  (0) 2009.12.15
아파치 미나  (0) 2009.12.15
Triple DES Java  (0) 2009.12.02
Stuts2 설정 - struts.properties  (0) 2009.10.09
회사에서 사용하려고 산 내 미니 가습기.. 
너무 이쁘단 말이지~ 
성능도 생각보다 좋다고~ 
다들 부러워하는 눈치야..
말을하지 말이야~ ㅋㅋ

'Story > Diary' 카테고리의 다른 글

크리스마스 이브  (0) 2009.12.24
재영네 돌잔치  (0) 2009.12.19
Upgrade your career  (0) 2009.11.06
SKT 일하러 가야지~~ ㅡㅡ;  (0) 2009.10.29
미스터 도넛  (0) 2009.10.28

Do you like your job?

Do you enjoy the people you work with?

Do you actually enjoy doing your job? If you wake up an hour early in the morning, do you think, “Yay! I can go in early and get another hour of work in!” Or does that sound ridiculous to you?

아하하하 모든 질문이 Yes가 되는 날이 있을까? ㅠㅠ

Are you learning? When was the last time you had to learn a new skill? Is this year kind of like last year, or are you doing something new, stretching yourself, challenging yourself to be better?

아~ 어렵구나~~ ㅠㅠ 언제쯤..

http://www.joelonsoftware.com/items/2009/11/05.html
-- Joel on Software

'Story > Diary' 카테고리의 다른 글

재영네 돌잔치  (0) 2009.12.19
새로 산 미니 가습기...  (0) 2009.11.22
SKT 일하러 가야지~~ ㅡㅡ;  (0) 2009.10.29
미스터 도넛  (0) 2009.10.28
단풍이 벌써.. 가을인가봐~~  (0) 2009.10.26

+ Recent posts