Java AES-256 양방향 암호화

성난호랑이 시니철 ㅣ 2024. 2. 16. 15:08

 

Java AES-256 양방향 암호화

 

AES-256은 Advanced Encryption Standard의 줄임말로, 256비트 길이의 키를 사용하는 암호화 알고리즘입니다.

 

주로 외부 사이트에 데이터를 주고 받을 때 많이 사용합니다.

 

AES 암호화의 종류는 AES-128, AES-192, AES-256이 있습니다. 

 

이중에 사용할 암호화는 AES-256 입니다.

 

예전 프로젝트 자바 버전이 낮을경우를 생각해서 Java 1.8 이상 이하 예제를 공유합니다.

 

 

자바 1.8 이하

import

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.Key;

 

테스트 

String str = "AES 암호화 테스트";
System.out.println("암호화 : "+this.aesEncode(str));
System.out.println("복호화 : "+this.aesDecode(this.aesEncode(str)));

 

1. 암호화

public String aesEncode(String str) throws UnsupportedEncodingException {
        if (str == null) {
            return "";
        }

        String key = "123456789ABCDEF!";  // 서로 정한 암호 키
        String iv = key.substring(0, 16);

        byte[] keyBytes = new byte[16];
        byte[] b = key.getBytes("UTF-8");
        int len = b.length;
        if (len > keyBytes.length) {
            len = keyBytes.length;
        }
        System.arraycopy(b, 0, keyBytes, 0, len);
        Key keySpec = new SecretKeySpec(keyBytes, "AES");

        String encStr = str;

        try {
            Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
            c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));

            byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
            encStr = new String(Base64.encodeBase64(encrypted)); // base64 인코딩
        } catch (Exception e) {
            e.printStackTrace();
        }

        return encStr;
    }

2. 복호화

public String aesDecode(String str) throws UnsupportedEncodingException {
        if (str == null) {
            return "";
        }

        String key = "123456789ABCDEF!";
        String iv = key.substring(0, 16);

        byte[] keyBytes = new byte[16];
        byte[] b = key.getBytes("UTF-8");
        int len = b.length;
        if (len > keyBytes.length) {
            len = keyBytes.length;
        }
        System.arraycopy(b, 0, keyBytes, 0, len);
        Key keySpec = new SecretKeySpec(keyBytes, "AES");

        String decStr = str;

        try {
            Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
            c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes("UTF-8")));

            byte[] byteStr = Base64.decodeBase64(str.getBytes());
            decStr = new String(c.doFinal(byteStr),"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return decStr;
    }

 

결과

암호화 : +d5xDBbqj0IpXqA7KLRCGz0SIuPeIYyYnQwyh0erqUU=
복호화 : AES 암호화 테스트

 

자바 1.8 이상

import

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

 

테스트

public void aesTest() throws Exception {
	String str = "AES 암호화 테스트";

	System.out.println("암호화 : "+this.aesEncode(str));
	System.out.println("복호화 : "+this.aesDecode(this.aesEncode(str)));
}

 

1. 암호화

public String aesEncode(String str) throws Exception  {
        String algorithm = "AES/CBC/PKCS5Padding";
        String key = "123456789ABCDEF!"; // 서로 정한 키
        IvParameterSpec iv = new IvParameterSpec(key.substring(0, 16).getBytes());

        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");

        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv);
        byte[] encrypted = cipher.doFinal(str.getBytes("UTF-8"));

        return Base64.getEncoder().encodeToString(encrypted);
}

 

2. 복호화

public String aesDecode(String str) throws Exception {
        String algorithm = "AES/CBC/PKCS5Padding";
        String key = "123456789ABCDEF!";
        IvParameterSpec iv = new IvParameterSpec(key.substring(0, 16).getBytes());

        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");

        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv);
        byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(str));

        return new String(decrypted, "UTF-8");
}

 

결과

암호화 : +d5xDBbqj0IpXqA7KLRCGz0SIuPeIYyYnQwyh0erqUU=
복호화 : AES 암호화 테스트

'공부 > JAVA' 카테고리의 다른 글

JAVA 문자열 뒤집기  (0) 2024.03.04
String 기능 모음  (0) 2024.03.04
for 문 종류 및 방법  (0) 2024.02.12
java 특정 날짜 요일 구하기, 날짜 하루 더하기 뺴기  (2) 2017.01.11
CSV 파일 읽어오기  (0) 2015.12.17