Notice
Recent Posts
Recent Comments
Link
투케이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
}
반응형
'Kotlin' 카테고리의 다른 글
Comments