투케이2K

112. (TWOK/UTIL) [Android/kotlin] C_Encryption - 데이터 암호화 인코딩 (encode) , 디코딩 (decode) 본문

투케이2K 유틸파일

112. (TWOK/UTIL) [Android/kotlin] C_Encryption - 데이터 암호화 인코딩 (encode) , 디코딩 (decode)

투케이2K 2022. 12. 15. 17:50

[설 명]

프로그램 : Android / Kotlin

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

 

[소스 코드]

 

package com.example.kotlinproject

import android.util.Base64
import android.util.Log
import java.net.URLDecoder
import java.net.URLEncoder
import java.security.spec.AlgorithmParameterSpec
import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec

class C_Encryption {


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





    // TODO [빠른 로직 찾기 : 주석 로직 찾기]
    /**
     * // -----------------------------------------
     * // [SEARCH FAST] : [getBase64EncodeString] : Base64 인코딩
     * // -----------------------------------------
     * // [SEARCH FAST] : [getBase64DecodeString] : Base64 디코딩
     * // -----------------------------------------
     * // [SEARCH FAST] : [urlEncodeString] : URL 인코딩
     * // -----------------------------------------
     * // [SEARCH FAST] : [urlDecodeString] : URL 디코딩
     * // -----------------------------------------
     * // [SEARCH FAST] : [stringToByte] : string 문자열 데이터를 byte 배열 값으로 반환 수행
     * // -----------------------------------------
     * // [SEARCH FAST] : [byteToString] : byte 배열 값을 string 문자열 데이터로 반환
     * // -----------------------------------------
     * // [SEARCH FAST] : [byteToHex] : byte 배열 값을 hex string 헥사 문자열로 반환
     * // -----------------------------------------
     * // [SEARCH FAST] : [getAES128EncodeString] : Aes128 인코딩 : key + iv 사용
     * // -----------------------------------------
     * // [SEARCH FAST] : [getAES128DecodeString] : Aes128 디코딩 : key + iv 사용
     * // -----------------------------------------
     * // [SEARCH FAST] : [getAES256EncodeString] : Aes256 인코딩 : key + iv 사용
     * // -----------------------------------------
     * // [SEARCH FAST] : [getAES256DecodeString] : Aes256 디코딩 : key + iv 사용
     * // -----------------------------------------
     */





    // TODO [companion object >> static 선언 실시]
    companion object {


        // TODO [SEARCH FAST] : [getBase64EncodeString] : Base64 인코딩
        fun getBase64EncodeString(content: String) : String {

            /**
             * // -----------------------------------------
             * [getBase64EncodeString 메소드 설명]
             * // -----------------------------------------
             * 1. 일반 String 문자열을 Base64 인코딩 수행 실시
             * // -----------------------------------------
             * 2. 호출 방법 : C_Encryption.getBase64EncodeString("hello")
             * // -----------------------------------------
             * 3. 리턴 데이터 : Base64 암호화 문자열 반환 (aGVsbG8=)
             * // -----------------------------------------
             * */


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [널 여부 체크]
                if (C_Util.stringNotNull(content) == true) {

                    // [Base64 암호화된 문자열로 반환]
                    returnData = Base64.encodeToString(content.toByteArray(), 0).toString()

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> getBase64EncodeString() :: Base64 인코딩 수행 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> getBase64EncodeString() :: Base64 인코딩 수행 실시]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT :: "+ content +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [getBase64DecodeString] : Base64 디코딩
        fun getBase64DecodeString(content: String) : String {

            /**
             * // -----------------------------------------
             * [getBase64DecodeString 메소드 설명]
             * // -----------------------------------------
             * 1. Base64 인코딩 문자열을 일반 String 문자열로 변환 수행 실시
             * // -----------------------------------------
             * 2. 호출 방법 : C_Encryption.getBase64DecodeString("aGVsbG8=")
             * // -----------------------------------------
             * 3. 리턴 데이터 : 일반 String 문자열 (hello)
             * // -----------------------------------------
             * */


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [널 여부 체크]
                if (C_Util.stringNotNull(content) == true) {

                    // [Base64 암호화된 문자열을 >> 복호화된 원본 문자열로 반환]
                    returnData = String(Base64.decode(content, 0))

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> getBase64DecodeString() :: Base64 디코딩 수행 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> getBase64EncodeString() :: Base64 디코딩 수행 실시]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT :: "+ content +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [urlEncodeString] : URL 인코딩
        fun urlEncodeString(data: String) : String {

            /**
             * // -----------------------------------------
             * [urlEncodeString 메소드 설명]
             * // -----------------------------------------
             * 1. String 문자열을 URL 인코딩 수행 실시
             * // -----------------------------------------
             * 2. 호출 방법 : C_Encryption.urlEncodeString("투케이")
             * // -----------------------------------------
             * 3. 리턴 데이터 : URL 인코딩 문자열 반환 (%ED%88%AC%EC%BC%80%EC%9D%B4)
             * // -----------------------------------------
             * */


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [널 여부 체크]
                if (C_Util.stringNotNull(data) == true) {

                    // [URL 인코딩 수행 실시]
                    returnData = URLEncoder.encode(data, "UTF-8")

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> urlEncodeString() :: URL 인코딩 수행 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> urlEncodeString() :: URL 인코딩 수행 실시]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT :: "+ data +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [urlDecodeString] : URL 디코딩
        fun urlDecodeString(data: String) : String {

            /**
             * // -----------------------------------------
             * [urlDecodeString 메소드 설명]
             * // -----------------------------------------
             * 1. URL 디코딩 수행 실시
             * // -----------------------------------------
             * 2. 호출 방법 : C_Encryption.urlDecodeString("%ED%88%AC%EC%BC%80%EC%9D%B4")
             * // -----------------------------------------
             * 3. 리턴 데이터 : URL 인코딩 문자열 반환 (투케이)
             * // -----------------------------------------
             * */


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [널 여부 체크]
                if (C_Util.stringNotNull(data) == true) {

                    // [URL 디코딩 수행 실시]
                    returnData = URLDecoder.decode(data, "UTF-8")

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> urlDecodeString() :: URL 디코딩 수행 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> urlDecodeString() :: URL 디코딩 수행 실시]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT :: "+ data +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [stringToByte] : string 문자열 데이터를 byte 배열 값으로 반환 수행
        fun stringToByte(data: String) : ByteArray? {

            /**
             * // -----------------------------------------
             * [stringToByte 메소드 설명]
             * // -----------------------------------------
             * 1. string 문자열 데이터를 byte 배열 값으로 반환 수행
             * // -----------------------------------------
             * 2. 호출 방법 : C_Encryption.stringToByte("hello")
             * // -----------------------------------------
             * 3. 리턴 데이터 : byte array 바이트 배열 데이터 [104, 101, 108, 108, 111]
             * // -----------------------------------------
             * */


            // [리턴 변수 선언]
            var returnData: ByteArray? = null


            // [로직 처리 실시]
            try {

                // [널 여부 체크]
                if (C_Util.stringNotNull(data) == true) {

                    // [string to byte]
                    val charSet = Charsets.UTF_8
                    returnData = data.toByteArray(charSet)

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> stringToByte() :: string 문자열 데이터를 byte 배열 값으로 반환 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> stringToByte() :: string 문자열 데이터를 byte 배열 값으로 반환 실시]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT :: "+ data +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData.contentToString() +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [byteToString] : byte 배열 값을 string 문자열 데이터로 반환
        fun byteToString(data: ByteArray?) : String {

            /**
             * // -----------------------------------------
             * [byteToString 메소드 설명]
             * // -----------------------------------------
             * 1. byte 배열 값을 string 문자열 데이터로 반환
             * // -----------------------------------------
             * 2. 호출 방법 :
             *
             * var array : ByteArray = ByteArray(5)
             * array[0] = 104
             * array[1] = 101
             * array[2] = 108
             * array[3] = 108
             * array[4] = 111
             *
             * C_Encryption.byteToString(array)
             *
             * // -----------------------------------------
             * 3. 리턴 데이터 : string 문자열 데이터 (hello)
             * // -----------------------------------------
             * */


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [널 여부 체크]
                if (data != null && data.size > 0 && data.isEmpty() == false) {

                    // [byte to string]
                    val charSet = Charsets.UTF_8
                    returnData = data.toString(charSet)

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> byteToString() :: byte 배열 값을 string 문자열 데이터로 반환]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> byteToString() :: byte 배열 값을 string 문자열 데이터로 반환]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT :: "+ data.contentToString() +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [byteToHex] : byte 배열 값을 hex string 헥사 문자열로 반환
        fun byteToHex(data: ByteArray?) : String {

            /**
             * // -----------------------------------------
             * [byteToHex 메소드 설명]
             * // -----------------------------------------
             * 1. byte 배열 값을 hex string 문자열 데이터로 반환
             * // -----------------------------------------
             * 2. 호출 방법 :
             *
             * var array : ByteArray = ByteArray(5)
             * array[0] = 104
             * array[1] = 101
             * array[2] = 108
             * array[3] = 108
             * array[4] = 111
             *
             * C_Encryption.byteToHex(array)
             *
             * // -----------------------------------------
             * 3. 리턴 데이터 : hex string 문자열 데이터 (0x68 0x65 0x6C 0x6C 0x6F)
             * // -----------------------------------------
             * */


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [널 여부 체크]
                if (data != null && data.size > 0 && data.isEmpty() == false) {

                    // [byte to hex string]
                    returnData = data.joinToString(separator = "") { eachByte -> "0x%02X ".format(eachByte) }
                    returnData = returnData.trim()

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> byteToHex() :: byte 배열 값을 hex string 문자열 데이터로 반환]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> byteToHex() :: byte 배열 값을 hex string 문자열 데이터로 반환]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT :: "+ data.contentToString() +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [getAES128EncodeString] : Aes128 인코딩 : key + iv 사용
        fun getAES128EncodeString(aes128SecretKey: String, aes128Iv: String, data: String) : String {

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


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [필수 데이터 널 여부 체크]
                if (C_Util.stringNotNull(aes128SecretKey) == true && aes128SecretKey.length == 16
                    && C_Util.stringNotNull(data) == true) {

                    // ----------------------------
                    // [캐릭터 셋 선언]
                    val charSet = Charsets.UTF_8
                    // ----------------------------
                    // [key >> byte 변환]
                    val keyByte = aes128SecretKey.toByteArray(charSet)
                    // ----------------------------
                    // [iv 값 널 체크 실시]
                    var ivByte : ByteArray? = null
                    if (C_Util.stringNotNull(aes128Iv) == true && aes128Iv.length == 16){
                        ivByte = aes128Iv.toByteArray(charSet)
                    }
                    else { // [널인 경우]
                        ivByte = ByteArray(16)
                    }
                    // ----------------------------
                    // [data >> byte 변환]
                    val dataByte = data.toByteArray(charSet)
                    // ----------------------------
                    // [AES 128 인코딩 수행]
                    val ivSpec: AlgorithmParameterSpec = IvParameterSpec(ivByte) // [알고리즘 스펙]

                    val newKey = SecretKeySpec(keyByte, "AES") // [암호화 알고리즘]

                    var cipher: Cipher? = null
                    cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") // [패딩]

                    cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec) // [key 지정해 암호화 지정]
                    // ----------------------------
                    // [리턴 데이터 반환 실시 : base64 데이터로 반환 실시]
                    returnData = Base64.encodeToString(cipher.doFinal(dataByte), Base64.DEFAULT)
                    // ----------------------------

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> getAES128EncodeString() :: aes128 비밀키 사용해 인코딩 수행 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "aes128SecretKey 비밀키 , data 데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> getAES128EncodeString() :: aes128 비밀키 사용해 인코딩 수행 실시]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT [KEY] :: "+ aes128SecretKey +"]")
            Log.i("","\n"+"[INPUT [IV] :: "+ aes128Iv +"]")
            Log.i("","\n"+"[INPUT [DATA] :: "+ data +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [getAES128DecodeString] : Aes128 디코딩 : key + iv 사용
        fun getAES128DecodeString(aes128SecretKey: String, aes128Iv: String, data: String) : String {

            /**
             * // -----------------------------------------
             * [getAES128DecodeString 메소드 설명]
             * // -----------------------------------------
             * 1. Aes128 암호화 방식을 사용해 데이터 디코딩 수행 실시
             * // -----------------------------------------
             * 2. 호출 방법 : [aes 비밀 키 / aes iv 바이트 [16 바이트 고정] / 디코딩할 데이터]
             *
             * C_Encryption.getAES128DecodeString("0123456789abcdef", "", "Z0x+8454yr2c7JwSWCOmOQ==") // hello
             *
             * C_Encryption.getAES128DecodeString("0123456789abcdef", "0123456789abcdef", "MOfLtxzZ0YgS4+5cPylFYw==") // hello
             *
             * // -----------------------------------------
             * 3. 리턴 데이터 : aes 암호화 디코딩 된 데이터 반환
             * // -----------------------------------------
             * 4. AES Secret Key 참고 : [aes128 = 16 byte / aes192 = 24 byte / aes256 = 32 byte]
             * // -----------------------------------------
             * */


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [필수 데이터 널 여부 체크]
                if (C_Util.stringNotNull(aes128SecretKey) == true && aes128SecretKey.length == 16
                    && C_Util.stringNotNull(data) == true) {

                    // ----------------------------
                    // [캐릭터 셋 선언]
                    val charSet = Charsets.UTF_8
                    // ----------------------------
                    // [key >> byte 변환]
                    val keyByte = aes128SecretKey.toByteArray(charSet)
                    // ----------------------------
                    // [iv 값 널 체크 실시]
                    var ivByte : ByteArray? = null
                    if (C_Util.stringNotNull(aes128Iv) == true && aes128Iv.length == 16){
                        ivByte = aes128Iv.toByteArray(charSet)
                    }
                    else { // [널인 경우]
                        ivByte = ByteArray(16)
                    }
                    // ----------------------------
                    // [data >> byte 변환 (base64 디코딩)]
                    val dataByte = Base64.decode(data, Base64.DEFAULT)
                    // ----------------------------
                    // [AES 128 디코딩 수행]
                    val ivSpec: AlgorithmParameterSpec = IvParameterSpec(ivByte) // [알고리즘 스펙]

                    val newKey = SecretKeySpec(keyByte, "AES") // [암호화 알고리즘]

                    var cipher: Cipher? = null
                    cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") // [패딩]

                    cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec) // [key 지정해 암호화 지정]
                    // ----------------------------
                    // [리턴 데이터 반환 실시]
                    returnData = cipher.doFinal(dataByte).toString(charSet)
                    // ----------------------------

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> getAES128DecodeString() :: aes128 비밀키 사용해 디코딩 수행 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "aes128SecretKey 비밀키 , data 데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> getAES128DecodeString() :: aes128 비밀키 사용해 디코딩 수행 실시]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT [KEY] :: "+ aes128SecretKey +"]")
            Log.i("","\n"+"[INPUT [IV] :: "+ aes128Iv +"]")
            Log.i("","\n"+"[INPUT [DATA] :: "+ data +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [getAES256EncodeString] : Aes256 인코딩 : key + iv 사용
        fun getAES256EncodeString(aes256SecretKey: String, aes256Iv: String, data: String) : String {

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


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [필수 데이터 널 여부 체크]
                if (C_Util.stringNotNull(aes256SecretKey) == true && aes256SecretKey.length == 32
                    && C_Util.stringNotNull(data) == true) {

                    // ----------------------------
                    // [캐릭터 셋 선언]
                    val charSet = Charsets.UTF_8
                    // ----------------------------
                    // [key >> byte 변환]
                    val keyByte = aes256SecretKey.toByteArray(charSet)
                    // ----------------------------
                    // [iv 값 널 체크 실시]
                    var ivByte : ByteArray? = null
                    if (C_Util.stringNotNull(aes256Iv) == true && aes256Iv.length == 16){
                        ivByte = aes256Iv.toByteArray(charSet)
                    }
                    else { // [널인 경우]
                        ivByte = ByteArray(16)
                    }
                    // ----------------------------
                    // [data >> byte 변환]
                    val dataByte = data.toByteArray(charSet)
                    // ----------------------------
                    // [AES 256 인코딩 수행]
                    val ivSpec: AlgorithmParameterSpec = IvParameterSpec(ivByte) // [알고리즘 스펙]

                    val newKey = SecretKeySpec(keyByte, "AES") // [암호화 알고리즘]

                    var cipher: Cipher? = null
                    cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") // [패딩]

                    cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec) // [key 지정해 암호화 지정]
                    // ----------------------------
                    // [리턴 데이터 반환 실시 : base64 데이터로 반환 실시]
                    returnData = Base64.encodeToString(cipher.doFinal(dataByte), Base64.DEFAULT)
                    // ----------------------------

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> getAES256EncodeString() :: aes256 비밀키 사용해 인코딩 수행 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "aes256SecretKey 비밀키 , data 데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> getAES256EncodeString() :: aes256 비밀키 사용해 인코딩 수행 실시]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT [KEY] :: "+ aes256SecretKey +"]")
            Log.i("","\n"+"[INPUT [IV] :: "+ aes256Iv +"]")
            Log.i("","\n"+"[INPUT [DATA] :: "+ data +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }





        // TODO [SEARCH FAST] : [getAES256DecodeString] : Aes256 디코딩 : key + iv 사용
        fun getAES256DecodeString(aes256SecretKey: String, aes256Iv: String, data: String) : String {

            /**
             * // -----------------------------------------
             * [getAES256DecodeString 메소드 설명]
             * // -----------------------------------------
             * 1. Aes256 암호화 방식을 사용해 데이터 디코딩 수행 실시
             * // -----------------------------------------
             * 2. 호출 방법 : [aes 비밀 키 / aes iv 바이트 [16 바이트 고정] / 디코딩할 데이터]
             *
             * C_Encryption.getAES256DecodeString("0123456789abcdef0123456789abcdef", "", "pZwJZBLuy3mDACEQT4YTBw==") // hello
             *
             * C_Encryption.getAES256DecodeString("0123456789abcdef0123456789abcdef", "0123456789abcdef", "UQdw44JDqzsxYpkSCwXDIA==") // hello
             *
             * // -----------------------------------------
             * 3. 리턴 데이터 : aes 암호화 디코딩 된 데이터 반환
             * // -----------------------------------------
             * 4. AES Secret Key 참고 : [aes128 = 16 byte / aes192 = 24 byte / aes256 = 32 byte]
             * // -----------------------------------------
             * */


            // [리턴 변수 선언]
            var returnData = ""


            // [로직 처리 실시]
            try {

                // [필수 데이터 널 여부 체크]
                if (C_Util.stringNotNull(aes256SecretKey) == true && aes256SecretKey.length == 32
                    && C_Util.stringNotNull(data) == true) {

                    // ----------------------------
                    // [캐릭터 셋 선언]
                    val charSet = Charsets.UTF_8
                    // ----------------------------
                    // [key >> byte 변환]
                    val keyByte = aes256SecretKey.toByteArray(charSet)
                    // ----------------------------
                    // [iv 값 널 체크 실시]
                    var ivByte : ByteArray? = null
                    if (C_Util.stringNotNull(aes256Iv) == true && aes256Iv.length == 16){
                        ivByte = aes256Iv.toByteArray(charSet)
                    }
                    else { // [널인 경우]
                        ivByte = ByteArray(16)
                    }
                    // ----------------------------
                    // [data >> byte 변환 (base64 디코딩)]
                    val dataByte = Base64.decode(data, Base64.DEFAULT)
                    // ----------------------------
                    // [AES 256 디코딩 수행]
                    val ivSpec: AlgorithmParameterSpec = IvParameterSpec(ivByte) // [알고리즘 스펙]

                    val newKey = SecretKeySpec(keyByte, "AES") // [암호화 알고리즘]

                    var cipher: Cipher? = null
                    cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") // [패딩]

                    cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec) // [key 지정해 암호화 지정]
                    // ----------------------------
                    // [리턴 데이터 반환 실시]
                    returnData = cipher.doFinal(dataByte).toString(charSet)
                    // ----------------------------

                }
                else {
                    Log.i("---","---" + "\n")
                    Log.e("//===========//","================================================")
                    Log.i("","\n"+"[C_Encryption >> getAES256DecodeString() :: aes256 비밀키 사용해 디코딩 수행 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "aes256SecretKey 비밀키 , data 데이터 null 널 임" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

            }
            catch (e: Exception) {
                e.printStackTrace()
            }


            // [로그 출력 실시]
            //*
            Log.i("---","---" + "\n")
            Log.d("//===========//","================================================")
            Log.i("","\n"+"[C_Encryption >> getAES256DecodeString() :: aes256 비밀키 사용해 디코딩 수행 실시]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[INPUT [KEY] :: "+ aes256SecretKey +"]")
            Log.i("","\n"+"[INPUT [IV] :: "+ aes256Iv +"]")
            Log.i("","\n"+"[INPUT [DATA] :: "+ data +"]")
            Log.i("","\n"+"-----------------------------------------")
            Log.i("","\n"+"[RETURN :: "+ returnData +"]")
            Log.d("//===========//","================================================")
            Log.i("---","---" + "\n")
            // */


            // [리턴 반환 실시]
            return returnData

        }


    } // [companion 종료]


} // TODO [클래스 종료]

 

반응형
Comments