Notice
Recent Posts
Recent Comments
Link
투케이2K
117. (java/자바) AES128 비밀키를 사용해 데이터 인코딩, 디코딩 실시 - SecretKeySpec, Cipher 사용 본문
Java
117. (java/자바) AES128 비밀키를 사용해 데이터 인코딩, 디코딩 실시 - SecretKeySpec, Cipher 사용
투케이2K 2021. 1. 12. 14:51/* =========================== */
[ 개발 환경 설정 ]
개발 툴 : Eclipse
개발 언어 : Java
/* =========================== */
/* =========================== */
[소스 코드]
package AI3;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Arrays;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class MainActivity21 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("[AES128 비밀키를 사용해 데이터 인코딩, 디코딩 실시 - SecretKeySpec, Cipher 사용]");
/*[설 명]
* 1. AES128 - 16바이트 비밀키를 사용해서 데이터를 인코딩, 디코딩하는 방법입니다
* 2. 비밀키란 - 인코딩 암호화 하는쪽과 디코딩 복호화 하는쪽이 서로 같은 키여야만 합니다
* 3. Cipher - 자바에서 암호화 복호화를 지원해주는 객체이며, AES, DES, RSA 등 다양한 암호방식을 지원합니다
* 4. 현재 Base64코딩은 자바에서 자체 지원해주는 객체를 사용했지만 경우에따라서 아파치 Base64 라이브러리를 사용해야합니다
*/
System.out.println("암호화 : "+getAES128_Encode("kwon1234"));
System.out.println("복호화 : "+getAES128_Decode("X1NNLZ6DlgN7tq3PFGIDIA=="));
}//메인 종료
// ==== [AES 암호화(인코딩) 메소드] ====
public static String getAES128_Encode(String data) {
try {
String secretKey = "0123456789abcdef"; //비밀키 선언 16바이트
byte ivBytes[] = new byte[16]; //AES128비트 암호화에서 16바이트는 변할 수 없다
Arrays.fill(ivBytes, (byte)0x00); //배열에 초기값 0으로 삽입 실시
byte textBytes[] = data.getBytes("UTF-8");
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(secretKey.getBytes("UTF-8"),"AES");
Cipher cipher = null;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
Encoder encoder = Base64.getEncoder(); //base64로 다시 포맷해서 인코딩 실시 (경우에 따라 아파치 base64 필요)
return encoder.encodeToString(cipher.doFinal(textBytes));
}
catch(Exception e) {
System.out.println(e.getMessage());
}
return "";
}
// ==== [AES 복호화(디코딩) 메소드] ====
public static String getAES128_Decode(String data) {
try {
String secretKey = "0123456789abcdef"; //비밀키 선언 16바이트
byte ivBytes[] = new byte[16]; //AES128비트 암호화에서 16바이트는 변할 수 없다
Arrays.fill(ivBytes, (byte)0x00); //배열에 초기값 0으로 삽입 실시
Decoder decoder = Base64.getDecoder(); //base64로 다시 포맷해서 디코딩 실시 (경우에 따라 아파치 base64 필요)
byte textBytes[] = decoder.decode(data);
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(secretKey.getBytes("UTF-8"),"AES");
Cipher cipher = null;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
return new String(cipher.doFinal(textBytes),"UTF-8");
}
catch (Exception e) {
System.out.println(e.getMessage());
}
return "";
}
}//클래스 종료
/* =========================== */
[결과 출력]
[AES128 비밀키를 사용해 데이터 인코딩, 디코딩 실시 - SecretKeySpec, Cipher 사용]
암호화 : X1NNLZ6DlgN7tq3PFGIDIA==
복호화 : kwon1234
/* =========================== */
/* =========================== */
[요약 설명]
* 1. 한글 데이터가 깨지는 경우 - euc-kr, utf-8 설정을 지정한다
* 2. FileInputStream - 파일을 입력 및 읽어 올 수 있는 객체이다
* 3. InputStream - 문자 및 바이트 입력, 읽어 올 수 있는 객체이다
/* =========================== */
반응형
'Java' 카테고리의 다른 글
119. (java/자바) MD5 사용해서 데이터 인코딩(암호화) 실시 (0) | 2021.01.13 |
---|---|
118. (java/자바) SHA256 사용해서 데이터 인코딩(암호화)실시 (0) | 2021.01.13 |
116. (java/자바) 텍스트(text) 파일 데이터 불러오기 및 읽기 - 한글 깨짐 현상 방지 실시 (0) | 2021.01.12 |
115. (java/자바) 텍스트(text) 파일 쓰기, 저장 실시 - BufferedOutputStream, FileOutputStream 사용 실시 (0) | 2021.01.12 |
114. (java/자바) abstract 추상클래스 사용해 메소드 명 정의 및 자식 클래스에서 메소드 내용 구현(동물소리 재정의)실시 (0) | 2021.01.11 |
Comments