투케이2K

45. (TWOK/UTIL) [Spring/Intelij] C_Encryption - 데이터 암호화 인코딩 (encode) , 디코딩 (decode) , URL 인코딩 및 디코딩 본문

투케이2K 유틸파일

45. (TWOK/UTIL) [Spring/Intelij] C_Encryption - 데이터 암호화 인코딩 (encode) , 디코딩 (decode) , URL 인코딩 및 디코딩

투케이2K 2022. 5. 17. 11:00

[설 명]

프로그램 : Spring / Intelij

설 명 : C_Encryption - 데이터 암호화 인코딩 (encode) , 디코딩 (decode) , URL 인코딩 및 디코딩

 

[소스 코드]

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import java.util.Arrays;

public class C_Encryption {


    /**
     * // -----------------------------------------
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 데이터 암호화 인코딩, 디코딩 관련 클래스
     * // -----------------------------------------
     * */





    // TODO [전역 변수 선언 실시]
    private static final String CLASS_NAME = "C_Encryption";





    // TODO [Base64 인코딩]
    public static String getBase64EncodeString(String content) {

        /**
         * // -----------------------------------------
         * [getBase64EncodeString 메소드 설명]
         * // -----------------------------------------
         * 1. 호출 방법 : C_Encryption.getBase64EncodeString("hello");
         * // -----------------------------------------
         * 2. 리턴 결과 : Base64 암호화 문자열 반환
         * // -----------------------------------------
         * */


        // [Base64 암호화된 문자열로 반환]
        String returnData = "";
        try {
            returnData = String.valueOf(new String(Base64.encodeBase64(content.getBytes("UTF-8"))));
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("getBase64EncodeString"));
        System.out.println("[INPUT] : "+String.valueOf(content));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 결과 반환]
        return returnData;
    }





    // TODO [Base64 디코딩]
    public static String getBase64DecodeString(String content) {

        /**
         * // -----------------------------------------
         * [getBase64DecodeString 메소드 설명]
         * // -----------------------------------------
         * 1. 호출 방법 : C_Encryption.getBase64DecodeString("aGVsbG8=");
         * // -----------------------------------------
         * 2. 리턴 결과 : Base64 복호화 원본 문자열 반환
         * // -----------------------------------------
         * */


        // [Base64 암호화된 문자열을 >> 복호화된 원본 문자열로 반환]
        String returnData = "";
        try {
            returnData = new String(Base64.decodeBase64(content));
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("getBase64DecodeString"));
        System.out.println("[INPUT] : "+String.valueOf(content));
        System.out.println("[RETURN] : "+String.valueOf(returnData));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환]
        return returnData;
    }





    // TODO [Aes128 인코딩 : key + iv 사용]
    public static String getAES128EncodeString(String aes128SecretKey, byte[] aes128ivBytes, String data){

        /**
         * // -----------------------------------------
         * [getAES128EncodeString 메소드 설명]
         * // -----------------------------------------
         * 1. Aes128 암호화 방식을 사용해 데이터 인코딩 수행 실시
         * // -----------------------------------------
         * 2. 호출 방법 : [aes 비밀 키 / aes iv 바이트 [16 바이트 고정] / 인코딩할 데이터]
         *    - C_Encryption.getAES128EncodeString("0123456789abcdef", new byte[16], "hello"); // [byte 공백]
         *    - C_Encryption.getAES128EncodeString("0123456789abcdef", "0123456789abcdef".getBytes("UTF-8"), "hello"); // [byte 지정]
         * // -----------------------------------------
         * 3. 리턴 결과 : aes 암호화 인코딩된 데이터를 base64 데이터로 리턴 실시
         * // -----------------------------------------
         * 4. AES Secret Key 참고 : [aes128 = 16 byte / aes192 = 24 byte / aes256 = 32 byte]
         * // -----------------------------------------
         * */


        // [aes 암호화 인코딩 수행 실시]
        String result = "";
        try {
            byte[] textBytes = data.getBytes("UTF-8");
            AlgorithmParameterSpec ivSpec = new IvParameterSpec(aes128ivBytes); // [알고리즘 스펙]
            SecretKeySpec newKey = new SecretKeySpec(aes128SecretKey.getBytes("UTF-8"), "AES"); // [암호화 알고리즘]
            Cipher cipher = null;
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // [패딩]
            cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec); // [key 지정해 암호화 지정]

            // [리턴 데이터 반환 실시 : base64 데이터로 반환 실시]
            result = String.valueOf(new String(Base64.encodeBase64(cipher.doFinal(textBytes))));
        }
        catch (Exception e){
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("getAES128EncodeString"));
        System.out.println("[INPUT] [KEY] : "+String.valueOf(aes128SecretKey));
        System.out.println("[INPUT] [IV] : "+String.valueOf(Arrays.toString(aes128ivBytes)));
        System.out.println("[INPUT] [DATA] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환]
        return result;
    }





    // TODO [Aes128 디코딩 : key + iv 사용]
    public static String getAES128DecodeString(String aes128SecretKey, byte[] aes128ivBytes, String data) {

        /**
         * // -----------------------------------------
         * [getAES128DecodeString 메소드 설명]
         * // -----------------------------------------
         * 1. Aes128 암호화 방식을 사용해 데이터 디코딩 수행 실시
         * // -----------------------------------------
         * 2. 호출 방법 : [aes 비밀 키 / aes iv 바이트 [16 바이트 고정] / base64로 된 aes 디코딩 데이터]
         *    - C_Encryption.getAES128DecodeString("0123456789abcdef", new byte[16], "Z0x+8454yr2c7JwSWCOmOQ=="); // [byte 공백]
         *    - C_Encryption.getAES128DecodeString("0123456789abcdef", "0123456789abcdef".getBytes("UTF-8"), "MOfLtxzZ0YgS4+5cPylFYw=="); // [byte 지정]
         * // -----------------------------------------
         * 3. 리턴 결과 : 원본 문자열 데이터 리턴
         * // -----------------------------------------
         * 4. AES Secret Key 참고 : [aes128 = 16 byte / aes192 = 24 byte / aes256 = 32 byte]
         * // -----------------------------------------
         * */


        // [aes 암호화 디코딩 수행 실시]
        String result = "";
        try {
            // [인풋으로 들어온 base64 문자열 데이터를 가지고 디코딩 수행 실시]
            byte[] textBytes = Base64.decodeBase64(data);
            AlgorithmParameterSpec ivSpec = new IvParameterSpec(aes128ivBytes); // [알고리즘 스펙]
            SecretKeySpec newKey = new SecretKeySpec(aes128SecretKey.getBytes("UTF-8"), "AES"); // [암호화 알고리즘]
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // [패딩]
            cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec); // [key 지정해 암호화 지정]

            // [리턴 데이터 반환 실시 : 원본 문자열 데이터 반환]
            result = new String(cipher.doFinal(textBytes), "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("getAES128DecodeString"));
        System.out.println("[INPUT] [KEY] : "+String.valueOf(aes128SecretKey));
        System.out.println("[INPUT] [IV] : "+String.valueOf(Arrays.toString(aes128ivBytes)));
        System.out.println("[INPUT] [DATA] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 결과 반환]
        return result;
    }





    // TODO [Aes256 인코딩 : key + iv 사용]
    public static String getAES256EncodeString(String aes256SecretKey, byte[] aes256ivBytes, String data) {

        /**
         * // -----------------------------------------
         * [getAES256EncodeString 메소드 설명]
         * // -----------------------------------------
         * 1. Aes256 암호화 방식을 사용해 데이터 인코딩 수행 실시
         * // -----------------------------------------
         * 2. 호출 방법 : [aes 비밀 키 / aes iv 바이트 [16 바이트 고정] / 인코딩할 데이터]
         *    - C_Encryption.getAES256EncodeString("0123456789abcdef0123456789abcdef", new byte[16], "hello"); // [byte 공백]
         *    - C_Encryption.getAES256EncodeString("0123456789abcdef0123456789abcdef", "0123456789abcdef".getBytes("UTF-8"), "hello"); // [byte 지정]
         * // -----------------------------------------
         * 3. 리턴 결과 : aes 암호화 인코딩된 데이터를 base64 데이터로 리턴 실시
         * // -----------------------------------------
         * 4. AES Secret Key 참고 : [aes128 = 16 byte / aes192 = 24 byte / aes256 = 32 byte]
         * // -----------------------------------------
         * */


        // [aes 암호화 인코딩 수행 실시]
        String result = "";
        try {
            byte[] textBytes = data.getBytes("UTF-8");
            AlgorithmParameterSpec ivSpec = new IvParameterSpec(aes256ivBytes); // [알고리즘 스펙]
            SecretKeySpec newKey = new SecretKeySpec(aes256SecretKey.getBytes("UTF-8"), "AES"); // [암호화 알고리즘]
            Cipher cipher = null;
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // [패딩]
            cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec); // [key 지정해 암호화 지정]

            // [리턴 데이터 반환 실시 : base64 데이터로 반환 실시]
            result = String.valueOf(new String(Base64.encodeBase64(cipher.doFinal(textBytes))));
        } catch (Exception e) {
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("getAES256EncodeString"));
        System.out.println("[INPUT] [KEY] : "+String.valueOf(aes256SecretKey));
        System.out.println("[INPUT] [IV] : "+String.valueOf(Arrays.toString(aes256ivBytes)));
        System.out.println("[INPUT] [DATA] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환]
        return result;
    }





    // TODO [Aes256 디코딩 : key + iv 사용]
    public static String getAES256DecodeString(String aes256SecretKey, byte[] aes256ivBytes, String data) {

        /**
         * // -----------------------------------------
         * [getAES256DecodeString 메소드 설명]
         * // -----------------------------------------
         * 1. Aes256 암호화 방식을 사용해 데이터 디코딩 수행 실시
         * // -----------------------------------------
         * 2. 호출 방법 : [aes 비밀 키 / aes iv 바이트 [16 바이트 고정] / base64로 된 aes 디코딩 데이터]
         *    - C_Encryption.getAES256DecodeString("0123456789abcdef0123456789abcdef", new byte[16], "pZwJZBLuy3mDACEQT4YTBw=="); // [byte 공백]
         *    - C_Encryption.getAES256DecodeString("0123456789abcdef0123456789abcdef", "0123456789abcdef".getBytes("UTF-8"), "UQdw44JDqzsxYpkSCwXDIA=="); // [byte 지정]
         * // -----------------------------------------
         * 3. 리턴 결과 : 원본 문자열 데이터 리턴
         * // -----------------------------------------
         * 4. AES Secret Key 참고 : [aes128 = 16 byte / aes192 = 24 byte / aes256 = 32 byte]
         * // -----------------------------------------
         * */


        // [aes 암호화 디코딩 수행 실시]
        String result = "";
        try {
            // [인풋으로 들어온 base64 문자열 데이터를 가지고 디코딩 수행 실시]
            byte[] textBytes = Base64.decodeBase64(data);
            AlgorithmParameterSpec ivSpec = new IvParameterSpec(aes256ivBytes); // [알고리즘 스펙]
            SecretKeySpec newKey = new SecretKeySpec(aes256SecretKey.getBytes("UTF-8"), "AES"); // [암호화 알고리즘]
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // [패딩]
            cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec); // [key 지정해 암호화 지정]

            // [리턴 데이터 반환 실시 : 원본 문자열 데이터 반환]
            result = new String(cipher.doFinal(textBytes), "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("getAES256DecodeString"));
        System.out.println("[INPUT] [KEY] : "+String.valueOf(aes256SecretKey));
        System.out.println("[INPUT] [IV] : "+String.valueOf(Arrays.toString(aes256ivBytes)));
        System.out.println("[INPUT] [DATA] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 결과 반환]
        return result;
    }





    // TODO [URL 인코딩]
    public static String urlEncodeString(String data) {

        /**
         * // -----------------------------------------
         * [urlEncodeString 메소드 설명]
         * // -----------------------------------------
         * 1. URL 인코딩 수행 메소드
         * // -----------------------------------------
         * 2. 호출 방법 : C_Encryption.urlEncodeString("투케이");
         * // -----------------------------------------
         * 3. 리턴 결과 : URL 인코딩 문자열 반환
         * // -----------------------------------------
         * */

        // [초기 리턴 데이터 변수 선언 실시]
        String result = "";

        // [사전 인풋 데이터 널 체크 실시]
        if (data != null
                && data.length()>0
                && data.trim().equals("") == false
                && data.trim().equals("null") == false
                && data.trim().equals("undefined") == false){

            try {
                // [URL 인코딩 수행 실시]
                result = URLEncoder.encode(data, "UTF-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("urlEncodeString"));
        System.out.println("[INPUT] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환]
        return result;
    }





    // TODO [URL 디코딩]
    public static String urlDecodeString(String data) {

        /**
         * // -----------------------------------------
         * [urlDecodeString 메소드 설명]
         * // -----------------------------------------
         * 1. URL 디코딩 수행 메소드
         * // -----------------------------------------
         * 2. 호출 방법 : C_Encryption.urlDecodeString("%ED%88%AC%EC%BC%80%EC%9D%B4");
         * // -----------------------------------------
         * 3. 리턴 결과 : 원본 string 문자열 반환
         * // -----------------------------------------
         * */

        // [초기 리턴 데이터 변수 선언 실시]
        String result = "";

        // [사전 인풋 데이터 널 체크 실시]
        if (data != null
                && data.length()>0
                && data.trim().equals("") == false
                && data.trim().equals("null") == false
                && data.trim().equals("undefined") == false){

            try {
                // [URL 인코딩 된 문자 인지 확인 실시]
                if (data.contains("%") == true){

                    // [URL 디코딩 변환 수행 실시]
                    String urlDecode = URLDecoder.decode(data, "UTF-8");

                    // [리턴 변수에 삽입]
                    result = String.valueOf(urlDecode);

                }
                else {

                    // [리턴 변수에 삽입]
                    result = data;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


        // [로그 출력]
        /*
        System.out.println("\n");
        System.out.println("================================================");
        System.out.println("[CLASS] : "+String.valueOf(CLASS_NAME));
        System.out.println("[METHOD] : "+String.valueOf("urlDecodeString"));
        System.out.println("[INPUT] : "+String.valueOf(data));
        System.out.println("[RETURN] : "+String.valueOf(result));
        System.out.println("================================================");
        System.out.println("\n");
        // */


        // [리턴 데이터 반환]
        return result;
    }





    // TODO [Hex String to Byte array 변환 실시]
    public static byte[] HexUtil_To_ByteArray(String data) {
        byte[] temp = new byte[data.length() / 2];
        for(int i = 0; i < data.length() / 2; ++i) {
            temp[i] = toByte(data.substring(i * 2, i * 2 + 2));
        }
        return temp;
    }
    public static byte toByte(String hexStr) {
        byte result = 0;
        String hex = hexStr.toUpperCase();
        for(int i = 0; i < hex.length(); ++i) {
            char c = hex.charAt(hex.length() - i - 1);
            byte b = toByte(c);
            result = (byte)(result | (b & 15) << i * 4);
        }
        return result;
    }
    private static byte toByte(char c) {
        switch(c) {
            case '0':
                return 0;
            case '1':
                return 1;
            case '2':
                return 2;
            case '3':
                return 3;
            case '4':
                return 4;
            case '5':
                return 5;
            case '6':
                return 6;
            case '7':
                return 7;
            case '8':
                return 8;
            case '9':
                return 9;
            case ':':
            case ';':
            case '<':
            case '=':
            case '>':
            case '?':
            case '@':
            default:
                return 0;
            case 'A':
                return 10;
            case 'B':
                return 11;
            case 'C':
                return 12;
            case 'D':
                return 13;
            case 'E':
                return 14;
            case 'F':
                return 15;
        }
    }


} // TODO [클래스 종료]
 

[결과 출력]


 

반응형
Comments