투케이2K

148. (kotlin/코틀린) [유틸 파일] getAES256SaltDecodeString : Aes256 디코딩 : key + iv + salt 사용 본문

Kotlin

148. (kotlin/코틀린) [유틸 파일] getAES256SaltDecodeString : Aes256 디코딩 : key + iv + salt 사용

투케이2K 2023. 1. 1. 15:34

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Kotlin

 

[소스 코드]

 

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

            /**
             * // -----------------------------------------
             * [getAES256SaltDecodeString 메소드 설명]
             * // -----------------------------------------
             * 1. Aes256 암호화 방식을 사용해 데이터 디코딩 수행 실시
             * // -----------------------------------------
             * 2. 호출 방법 : [aes 비밀 키 / aes iv 바이트 [32 hex 값 = 16 바이트 고정] / Salt [32 hex 값 = 16 바이트 고정] / 인코딩할 데이터]
             *
             * C_Encryption.getAES256SaltDecodeString("0123456789abcdef0123456789abcdef", "0123456789abcdef0123456789abcdef", "0123456789abcdef0123456789abcdef", "0yHy16m2dy5OpZH2+NX/4w==")
             *
             * // -----------------------------------------
             * 3. 리턴 데이터 : aes 암호화 인코딩된 데이터를 base64 데이터로 리턴 실시
             *
             * 샘플 - hello
             * // -----------------------------------------
             * 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(aes256Iv) == true && aes256Iv.length == 32
                    && C_Util.stringNotNull(aes256Salt) == true && aes256Salt.length == 32
                    && C_Util.stringNotNull(data) == true) {

                    // ----------------------------
                    // [캐릭터 셋 선언]
                    val charSet = Charsets.UTF_8
                    // ----------------------------
                    // [key >> byte 변환]
                    val keyByte = aes256SecretKey.toByteArray(charSet)
                    // ----------------------------
                    // [iv >> byte 변환]
                    var ivByte = hexStringToByteArray(aes256Iv)
                    // ----------------------------
                    // [salt >> byte 변환]
                    var saltByte = hexStringToByteArray(aes256Salt)
                    // ----------------------------
                    // [data >> byte 변환 (base64 디코딩)]
                    val dataByte = Base64.decode(data, Base64.DEFAULT)
                    // ----------------------------
                    // [AES 256 디코딩 수행]
                    val ivSpec: AlgorithmParameterSpec = IvParameterSpec(ivByte!!.toByteArray()) // [알고리즘 스펙]
                    val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1") // [salt 값 포함 타입]

                    // [KeySpec : secretKey / salt / iterationCount / keyLength]
                    val spec: KeySpec = PBEKeySpec(aes256SecretKey.toCharArray(), saltByte!!.toByteArray(), 1000, 256)
                    val tmp = factory.generateSecret(spec)

                    val newKey = SecretKeySpec(tmp.encoded, "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 >> getAES256SaltDecodeString() :: aes256 비밀키 사용해 인코딩 수행 실시]")
                    Log.i("","\n"+"-----------------------------------------")
                    Log.i("","\n"+"[error :: "+ "key, iv, salt, data is null" +"]")
                    Log.e("//===========//","================================================")
                    Log.i("---","---" + "\n")
                }

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


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


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

        }

 

반응형
Comments