ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 블록 암호를 사용한 암/복호화
    java/jca 2019. 6. 24. 16:21

    암호화와 복호화를 하기 위해서는 비밀키가 필요하다.

    JCA에서 제공하는 키관련 클래스를 사용해서 비밀키를 생성하는 방법

    1. KeyGenerator 클래스를 사용한 비밀키 생성 

    KeyGenerator(javax.crypto.KeyGenerator) 클래스는 비밀키를 생성하는 기능을 제공한다. 

    KeyGenerator 클래스의 getInstance() 메소드를 호출하여 

    주어진 알고리즘에 해당하는 인스턴스를 생성한 다음 , generatorKey() 메소드로 새로운 비밀키를 생성한다.

    init() 메소드를 호출하면 키의 크기. 사용할 난수 생성기, 알고리즘에 필요한 파라미터가 초기화된다.

     

    package jce;
    
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.KeyGenerator;
    
    public class KeyGeneratorEX {
    	public static void main(String[] args) {
    		KeyGenerator keyGenerator;
    		try {
    			keyGenerator = KeyGenerator.getInstance("AES");//해당알고리즘의 인스턴스 생성 
    			keyGenerator.init(128);//키의 크기, 사용할 난수 생성기 , 알고리즘에 필요한 파라미터 초기화 
    		} catch (NoSuchAlgorithmException e) {
    			e.printStackTrace();
    		}
    		
    	}
    }
    

     

     

    메소드 설명
    public static KeyGenerator getInstance(String algorithm) 주어진 알고리즘에 해당하는 인스턴스를 생성한다.
    public static KeyGenerator getInstance(String algorithm, String provider) 주어진 프로바이터로부터 알고리즘에 해당하는 인스턴스를 생성한다.
    public final SeceretKey generateKey() 새로운 비밀키를 생성한다.
    public void init(int keysize) 키의 크기를 설정한다.
    public void init(int keysize, SecureRandom random) 키의 크기와 난수 생성기를 생성한다.
    public void init(SecureRandom random) 난수 생성기를 설정한다.
    public void init(AlgorithmParameterSpec params) 알고리즘 파라미터를 설정한다.

    public vodi init(AlgorithmParameterSpec params, SecureRandom random)

    알고리즘의 파라미터와 난수 생성기를 설정한다.

    2. SecretKeySpec 클래스를 사용한 비밀키 생성 

    저장된 키를 불러와서 사용하려면 SecretKeySpec 클래스를 사용한다.

    SecretSpec 클래스의 생성자를 사용해서 바이트 배열의 데이터키를 비밀키로 변환할 수 있다.

    package jce;
    
    import java.security.SecureRandom;
    
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    
    public class SecretKeySpecEx {
    	public static void main(String[] args) {
    		SecureRandom random = new SecureRandom();
    		byte[] keyData = new byte[16];
    		random.nextBytes(keyData);
    		
    		SecretKey secretKey = new SecretKeySpec(keyData,"AES");
    		
    		
    	}
    }
    

    SecretKeySpec 클래스에서 제공하는 생성자 

    생성자 설명
    SecretKeySpec(byte[]key,String Algorithm) 주어진 바이트 배열과 알고리즘을 사용하여 SecretKeySpec을 생성한다.
    SecretKeySpec(byte[] key, int offset, int len, String algorithm) 주어진 바이트 배열의 offset에서 부터 len만큼의 크기를 가지는 배열과 알고리즘을 사용하여 SecretKeySpec을 생성한다.

     

    대칭키 저장 

    키를 저장하고 싶을 때에는 Key 인터페이스에 선언된 getEncoded() 메소드를 호출하여 바이트 배열 값을 가져와서 저장하면 된다. 

    SecretKey 인터페이스는 Key인터페이스를 상속받는다.

    package jce;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    
    public class SecretKeySave {
    	public static void main(String[] args) {
    		KeyGenerator keyGenerator;
    		try {
    			keyGenerator = KeyGenerator.getInstance("AES");
    			keyGenerator.init(128);
    			SecretKey secretKey = keyGenerator.generateKey();
    			
    			byte[] keyData = secretKey.getEncoded();
    			
    			System.out.println("Algorithm : "+ secretKey.getAlgorithm());
    			System.out.println("Format : "+ secretKey.getFormat());
    			
    			File keyFile = new File("D:/EDOC_JAVA/SRC/test/cert/key/secretKey.raw");
    			
    			OutputStream out = new BufferedOutputStream(new FileOutputStream(keyFile));
    			
    			try{
    				out.write(keyData);
    			} catch (IOException e) {
    				e.printStackTrace();
    			}finally {
    				try {
    					out.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		} catch (NoSuchAlgorithmException | FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    

     

    Key 인터페이스의 주요 메소드 

    메소드 설명
    public String getAlgorithm() 키가사용된 암호 알고리즘의 이름을 가져온다.
    public byte[] getEncoded() 키의 포맷에 맞는 바이트 배열을 가져온다.
    public String getFormat() 키의 포맷 이름을 가져온다. 

    3. SecretKeyFactory 클래스를 사용한 비밀키 생성 

    secretKeyFactory(java.security.KeyFactory)클래스는 키스펙을 키 객체로 변환하는 기능과 키객체를 키 스펙으로 변환하는 기능을 제공한다.

    SecretkeyFactory 클래스를 사용한 비밀키 생성 

    DESKeySpec, DESedeKeySpec 등과 같은 키 스펙 클래스는 SecretKeyFactory를 통해 키 객체로 변환 시켜야만 비밀키로 사용할 수 있다.

    package jce;
    
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.spec.InvalidKeySpecException;
    
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESedeKeySpec;
    
    public class SecretKeyFactoryEx {
    	public static void main(String[] args) {
    		try {
    			byte[] desKeyData = {(byte)0x01, (byte)0x09, (byte)0x07, (byte)0x07, (byte)0x01, (byte)0x02, (byte)0x08};
    			DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(desKeyData);
    			
    			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    			
    			SecretKey secretKey = keyFactory.generateSecret(deSedeKeySpec);
    		} catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    }
    

     

    SecretkeySpec 클래스는 키 스펙이면서 동시에 키 객체다 (KeySpec인터페이스와 Key 인터페이스를 구현하였다.)

    그래서 SecretKeySpec 클래스는 생성한 인스턴스 키로 바로 사용할 수 있다.

    byte[] desKeyData = {(byte)0x01, (byte)0x09, (byte)0x07, (byte)0x07, (byte)0x01, (byte)0x02, (byte)0x08};
    			DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(desKeyData);
    			
    			SecretKey secretKey = new SecretKeySpec(desKeyData,"DES");

    SecretKeyFactory 클래스에서 제공하는 주요 메소드는 다음과 같다. 

    메소드 설명
    public static getinstance(String algorithm) 주어진 알고리즘에 해당하는 인스턴스를 생성한다.
    public SecretKey generateSecret(KeySpec keySpec) 주어진 키 스펙에 해당하는 비밀키를 생성한다.
    public KeySpec getKeySpec(Secret key, Class KeySpec) 주어진 비밀키의 키스펙을 생성한다.
Designed by Tistory.