Java로 Data 암호화 및 복호화 하기 - AES256

 서버에서 동작하는 Application은 Java 기반으로, 그 데이터와 연동되는 다른 API 기능은 PHP로 개발을 진행하는 와중에 두 사이에서 같은 데이터를 암/복호화해서 사용하는 상황이 발생하였습니다.

 

처음엔 Laravel Framework의 Crypt Facades를 사용하여 라라 벨에서만 복호화를 진행하였는데, Java Application에서 암호화시킨 데이터를 같은 맥락으로 Laravel Framework에서 복호화시켜 사용해야 함에 따라 기본 Laravel App Key를 사용했던 Crtpt Facades를 대체하며 같이 Java에서 사용할 AES256 알고리즘 형태의 암복호화 소스가 필요해졌고, Java는 아래 형태로 개발을 진행하게 되었습니다.

 

[연관글]

 

PHP로 Data 암호화 및 복호화 하기 - AES256

서버에서 동작하는 Application은 Java 기반으로, 그 데이터와 연동되는 다른 API 기능은 PHP로 개발을 진행하는 와중에 두 사이에서 같은 데이터를 암/복호화해서 사용하는 상황이 발생하였습니다.

min-nine.tistory.com


1. AES256Crypt Class 생성 및 encode, decode function 생성

package testGradleProject.app;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Base64;


public class Aes256Crypt {
    public static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

    public static String aes256Encode(String str, String key) throws Exception {
        byte[] textBytes = str.getBytes(StandardCharsets.UTF_8);
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
        SecretKeySpec newKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
        return Base64.getEncoder().encodeToString(cipher.doFinal(textBytes));
    }

    public static String aes256Decode(String str, String key) throws Exception {
        byte[] textBytes = Base64.getDecoder().decode(str);
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
        SecretKeySpec newKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
        return new String(cipher.doFinal(textBytes), StandardCharsets.UTF_8);
    }
}

 

2. Main Class의 Main method에서 실행

package testGradleProject.app;

public class App {
    public static final String plainText = "안녕! 반가워 나는 김민규라고해!";
    public static final String secretKey = "32fakecodingsecretinyouranykey32";

    public static void main(String[] args) {
        try {
            System.out.println("당신의 secret Key 32Byte를 입력하세요 : "+secretKey);
            System.out.println("당신의 secret Key 는 ["+secretKey.getBytes().length+"] Byte입니다. ");
            String encryptText = Aes256Crypt.aes256Encode(plainText, secretKey);
            String decryptText = Aes256Crypt.aes256Decode(encryptText, secretKey);
            
            System.out.println("암호화된 값 : "+encryptText);
            System.out.println("복호화된 값 : "+decryptText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

3. 출력