Notice
Recent Posts
Recent Comments
Link
투케이2K
45. (TWOK/UTIL) [Spring/Intelij] C_Encryption - 데이터 암호화 인코딩 (encode) , 디코딩 (decode) , URL 인코딩 및 디코딩 본문
투케이2K 유틸파일
45. (TWOK/UTIL) [Spring/Intelij] C_Encryption - 데이터 암호화 인코딩 (encode) , 디코딩 (decode) , URL 인코딩 및 디코딩
투케이2K 2022. 5. 17. 11:00[설 명]
프로그램 : Spring / Intelij
설 명 : C_Encryption - 데이터 암호화 인코딩 (encode) , 디코딩 (decode) , URL 인코딩 및 디코딩
[소스 코드]
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import java.util.Arrays;
public class C_Encryption {
/**
* // -----------------------------------------
* TODO [클래스 설명]
* // -----------------------------------------
* 1. 데이터 암호화 인코딩, 디코딩 관련 클래스
* // -----------------------------------------
* */
// TODO [전역 변수 선언 실시]
private static final String CLASS_NAME = "C_Encryption";
// TODO [Base64 인코딩]
public static String getBase64EncodeString(String content) {
/**
* // -----------------------------------------
* [getBase64EncodeString 메소드 설명]
* // -----------------------------------------
* 1. 호출 방법 : C_Encryption.getBase64EncodeString("hello");
* // -----------------------------------------
* 2. 리턴 결과 : Base64 암호화 문자열 반환
* // -----------------------------------------
* */
// [Base64 암호화된 문자열로 반환]
String returnData = "";
try {
returnData = String.valueOf(new String(Base64.encodeBase64(content.getBytes("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("getBase64EncodeString"));
System.out.println("[INPUT] : "+String.valueOf(content));
System.out.println("[RETURN] : "+String.valueOf(returnData));
System.out.println("================================================");
System.out.println("\n");
// */
// [리턴 결과 반환]
return returnData;
}
// TODO [Base64 디코딩]
public static String getBase64DecodeString(String content) {
/**
* // -----------------------------------------
* [getBase64DecodeString 메소드 설명]
* // -----------------------------------------
* 1. 호출 방법 : C_Encryption.getBase64DecodeString("aGVsbG8=");
* // -----------------------------------------
* 2. 리턴 결과 : Base64 복호화 원본 문자열 반환
* // -----------------------------------------
* */
// [Base64 암호화된 문자열을 >> 복호화된 원본 문자열로 반환]
String returnData = "";
try {
returnData = new String(Base64.decodeBase64(content));
}
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("getBase64DecodeString"));
System.out.println("[INPUT] : "+String.valueOf(content));
System.out.println("[RETURN] : "+String.valueOf(returnData));
System.out.println("================================================");
System.out.println("\n");
// */
// [리턴 데이터 반환]
return returnData;
}
// TODO [Aes128 인코딩 : key + iv 사용]
public static String getAES128EncodeString(String aes128SecretKey, byte[] aes128ivBytes, String data){
/**
* // -----------------------------------------
* [getAES128EncodeString 메소드 설명]
* // -----------------------------------------
* 1. Aes128 암호화 방식을 사용해 데이터 인코딩 수행 실시
* // -----------------------------------------
* 2. 호출 방법 : [aes 비밀 키 / aes iv 바이트 [16 바이트 고정] / 인코딩할 데이터]
* - C_Encryption.getAES128EncodeString("0123456789abcdef", new byte[16], "hello"); // [byte 공백]
* - C_Encryption.getAES128EncodeString("0123456789abcdef", "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(aes128ivBytes); // [알고리즘 스펙]
SecretKeySpec newKey = new SecretKeySpec(aes128SecretKey.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("getAES128EncodeString"));
System.out.println("[INPUT] [KEY] : "+String.valueOf(aes128SecretKey));
System.out.println("[INPUT] [IV] : "+String.valueOf(Arrays.toString(aes128ivBytes)));
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 [Aes128 디코딩 : key + iv 사용]
public static String getAES128DecodeString(String aes128SecretKey, byte[] aes128ivBytes, String data) {
/**
* // -----------------------------------------
* [getAES128DecodeString 메소드 설명]
* // -----------------------------------------
* 1. Aes128 암호화 방식을 사용해 데이터 디코딩 수행 실시
* // -----------------------------------------
* 2. 호출 방법 : [aes 비밀 키 / aes iv 바이트 [16 바이트 고정] / base64로 된 aes 디코딩 데이터]
* - C_Encryption.getAES128DecodeString("0123456789abcdef", new byte[16], "Z0x+8454yr2c7JwSWCOmOQ=="); // [byte 공백]
* - C_Encryption.getAES128DecodeString("0123456789abcdef", "0123456789abcdef".getBytes("UTF-8"), "MOfLtxzZ0YgS4+5cPylFYw=="); // [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(aes128ivBytes); // [알고리즘 스펙]
SecretKeySpec newKey = new SecretKeySpec(aes128SecretKey.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("getAES128DecodeString"));
System.out.println("[INPUT] [KEY] : "+String.valueOf(aes128SecretKey));
System.out.println("[INPUT] [IV] : "+String.valueOf(Arrays.toString(aes128ivBytes)));
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 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;
}
// TODO [URL 인코딩]
public static String urlEncodeString(String data) {
/**
* // -----------------------------------------
* [urlEncodeString 메소드 설명]
* // -----------------------------------------
* 1. URL 인코딩 수행 메소드
* // -----------------------------------------
* 2. 호출 방법 : C_Encryption.urlEncodeString("투케이");
* // -----------------------------------------
* 3. 리턴 결과 : URL 인코딩 문자열 반환
* // -----------------------------------------
* */
// [초기 리턴 데이터 변수 선언 실시]
String result = "";
// [사전 인풋 데이터 널 체크 실시]
if (data != null
&& data.length()>0
&& data.trim().equals("") == false
&& data.trim().equals("null") == false
&& data.trim().equals("undefined") == false){
try {
// [URL 인코딩 수행 실시]
result = URLEncoder.encode(data, "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("urlEncodeString"));
System.out.println("[INPUT] : "+String.valueOf(data));
System.out.println("[RETURN] : "+String.valueOf(result));
System.out.println("================================================");
System.out.println("\n");
// */
// [리턴 데이터 반환]
return result;
}
// TODO [URL 디코딩]
public static String urlDecodeString(String data) {
/**
* // -----------------------------------------
* [urlDecodeString 메소드 설명]
* // -----------------------------------------
* 1. URL 디코딩 수행 메소드
* // -----------------------------------------
* 2. 호출 방법 : C_Encryption.urlDecodeString("%ED%88%AC%EC%BC%80%EC%9D%B4");
* // -----------------------------------------
* 3. 리턴 결과 : 원본 string 문자열 반환
* // -----------------------------------------
* */
// [초기 리턴 데이터 변수 선언 실시]
String result = "";
// [사전 인풋 데이터 널 체크 실시]
if (data != null
&& data.length()>0
&& data.trim().equals("") == false
&& data.trim().equals("null") == false
&& data.trim().equals("undefined") == false){
try {
// [URL 인코딩 된 문자 인지 확인 실시]
if (data.contains("%") == true){
// [URL 디코딩 변환 수행 실시]
String urlDecode = URLDecoder.decode(data, "UTF-8");
// [리턴 변수에 삽입]
result = String.valueOf(urlDecode);
}
else {
// [리턴 변수에 삽입]
result = data;
}
} 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("urlDecodeString"));
System.out.println("[INPUT] : "+String.valueOf(data));
System.out.println("[RETURN] : "+String.valueOf(result));
System.out.println("================================================");
System.out.println("\n");
// */
// [리턴 데이터 반환]
return result;
}
// TODO [Hex String to Byte array 변환 실시]
public static byte[] HexUtil_To_ByteArray(String data) {
byte[] temp = new byte[data.length() / 2];
for(int i = 0; i < data.length() / 2; ++i) {
temp[i] = toByte(data.substring(i * 2, i * 2 + 2));
}
return temp;
}
public static byte toByte(String hexStr) {
byte result = 0;
String hex = hexStr.toUpperCase();
for(int i = 0; i < hex.length(); ++i) {
char c = hex.charAt(hex.length() - i - 1);
byte b = toByte(c);
result = (byte)(result | (b & 15) << i * 4);
}
return result;
}
private static byte toByte(char c) {
switch(c) {
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case ':':
case ';':
case '<':
case '=':
case '>':
case '?':
case '@':
default:
return 0;
case 'A':
return 10;
case 'B':
return 11;
case 'C':
return 12;
case 'D':
return 13;
case 'E':
return 14;
case 'F':
return 15;
}
}
} // TODO [클래스 종료]
[결과 출력]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments