Notice
Recent Posts
Recent Comments
Link
투케이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 [클래스 종료]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments