투케이2K

117. (java/자바) AES128 비밀키를 사용해 데이터 인코딩, 디코딩 실시 - SecretKeySpec, Cipher 사용 본문

Java

117. (java/자바) AES128 비밀키를 사용해 데이터 인코딩, 디코딩 실시 - SecretKeySpec, Cipher 사용

투케이2K 2021. 1. 12. 14:51

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : Eclipse

개발 언어 : Java

/* =========================== */

/* =========================== */

[소스 코드]

 

package AI3;

import java.security.spec.AlgorithmParameterSpec;
import java.util.Arrays;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class MainActivity21 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("[AES128 비밀키를 사용해 데이터 인코딩, 디코딩 실시 - SecretKeySpec, Cipher 사용]");
		
		/*[설 명]
		 * 1. AES128 - 16바이트 비밀키를 사용해서 데이터를 인코딩, 디코딩하는 방법입니다
		 * 2. 비밀키란 - 인코딩 암호화 하는쪽과 디코딩 복호화 하는쪽이 서로 같은 키여야만 합니다
		 * 3. Cipher - 자바에서 암호화 복호화를 지원해주는 객체이며, AES, DES, RSA 등 다양한 암호방식을 지원합니다
		 * 4. 현재 Base64코딩은 자바에서 자체 지원해주는 객체를 사용했지만 경우에따라서 아파치 Base64 라이브러리를 사용해야합니다
		 */
		
		System.out.println("암호화 : "+getAES128_Encode("kwon1234"));
		System.out.println("복호화 : "+getAES128_Decode("X1NNLZ6DlgN7tq3PFGIDIA=="));

	}//메인 종료
	
	// ==== [AES 암호화(인코딩) 메소드] ====
	public static String getAES128_Encode(String data) {
		try {
			String secretKey = "0123456789abcdef"; //비밀키 선언 16바이트
    		
			byte ivBytes[] = new byte[16]; //AES128비트 암호화에서 16바이트는 변할 수 없다 
			Arrays.fill(ivBytes, (byte)0x00); //배열에 초기값 0으로 삽입 실시
        	
			byte textBytes[] = data.getBytes("UTF-8");
        	
			AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
			SecretKeySpec newKey = new SecretKeySpec(secretKey.getBytes("UTF-8"),"AES");
			Cipher cipher = null;
			cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
        	        	
			Encoder encoder = Base64.getEncoder(); //base64로 다시 포맷해서 인코딩 실시 (경우에 따라 아파치 base64 필요)
			return encoder.encodeToString(cipher.doFinal(textBytes));        	
		}
		catch(Exception e) {
			System.out.println(e.getMessage());    	
		}
		return "";
	}
	
	// ==== [AES 복호화(디코딩) 메소드] ====
	public static String getAES128_Decode(String data) {
		try {
			String secretKey = "0123456789abcdef"; //비밀키 선언 16바이트
    		
			byte ivBytes[] = new byte[16]; //AES128비트 암호화에서 16바이트는 변할 수 없다 
			Arrays.fill(ivBytes, (byte)0x00); //배열에 초기값 0으로 삽입 실시
        	
			Decoder decoder = Base64.getDecoder(); //base64로 다시 포맷해서 디코딩 실시 (경우에 따라 아파치 base64 필요)
			byte textBytes[] = decoder.decode(data);
    		
			AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
			SecretKeySpec newKey = new SecretKeySpec(secretKey.getBytes("UTF-8"),"AES");
			Cipher cipher = null;
			cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);    
        	
			return new String(cipher.doFinal(textBytes),"UTF-8");
		}
		catch (Exception e) {
			System.out.println(e.getMessage());
		}
		return "";
	}

}//클래스 종료

/* =========================== */

[결과 출력]

[AES128 비밀키를 사용해 데이터 인코딩, 디코딩 실시 - SecretKeySpec, Cipher 사용]

암호화 : X1NNLZ6DlgN7tq3PFGIDIA==

복호화 : kwon1234

/* =========================== */

/* =========================== */

[요약 설명]

* 1. 한글 데이터가 깨지는 경우 - euc-kr, utf-8 설정을 지정한다

* 2. FileInputStream - 파일을 입력 및 읽어 올 수 있는 객체이다

* 3. InputStream - 문자 및 바이트 입력, 읽어 올 수 있는 객체이다

/* =========================== */

반응형
Comments