투케이2K

101. (spring/스프링) cipher 사용해 aes256 암호화 인코딩 , 디코딩 수행 실시 본문

Spring

101. (spring/스프링) cipher 사용해 aes256 암호화 인코딩 , 디코딩 수행 실시

투케이2K 2022. 10. 5. 20:52

[개발 환경 설정]

개발 툴 : inteli j

개발 언어 : spring

 

 


 

[소스 코드]

    // 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;
    }

반응형
Comments