본문 바로가기
IT 개발 이야기/Java

[Java] AES 암호화/복호화 예제( AES-256 )

by 개발자 Aiden 2023. 2. 12.
반응형

데이터의 보안은 현대 IT 환경에서 중요한 이슈 중 하나입니다. 특히 개인정보와 같은 민감한 정보는 암호화 없이는 저장하거나 전송할 수 없습니다. 이러한 중요한 데이터를 안전하게 보호하기 위해 AES-256 암호화가 널리 사용되고 있습니다.

Java에서의 AES-256 양방향 데이터 암호화

AES-256은 Advanced Encryption Standard의 줄임말로, 256비트 길이의 키를 사용하는 암호화 알고리즘입니다. 이 알고리즘은 미국 정부에서도 공식적으로 사용되며, 전 세계적으로 널리 인정받는 암호화 표준 중 하나입니다.

AES 암호화/복호화


왜 AES 암호화가 널리 사용되는가?

  1. 대칭키 암호화의 장점 : AES는 대칭키 암호 알고리즘으로, 암호화와 복호화에 동일한 키를 사용합니다. 이는 암호화와 복호화 과정을 간단하고 빠르게 만들어 줍니다.
  2. 높은 보안성 : AES-256은 256비트 길이의 키를 사용하기 때문에, 무차별 대입 공격에 매우 강합니다.
  3. 속도 : AES는 RSA와 같은 비대칭키 암호 알고리즘에 비해 매우 빠른 속도를 자랑합니다. 이는 대량의 데이터를 빠르게 암호화하거나 복호화할 때 유리합니다.

 

Java로 AES-256 암호화/복호화 구현하기

AES-256 암호화를 Java에서 구현하는 것은 복잡한 과정을 거치지 않아도 가능합니다. 하지만, 키 관리와 암호화 모드 선택 등의 세부 사항에 주의를 기울여야 합니다.

반응형


1. AES 개인키( PrivateKey ) 설정

개인키는 암호화와 복호화에 사용되는 중요한 정보입니다. 이 키는 외부에 노출되어서는 안 되며, 안전하게 보관되어야 합니다.

package com.hyo.constant;

public final class WebConstants {
	
  // AES PRIVATE KEY. 256bit.
  public static final String PRIVATE_KEY = "AES_PRIVATE_KEY_THIS_TEST_32BYTE";
}

 

2. AES 암호화/복호화 유틸리티 생성

Java에서는 javax.crypto 패키지를 사용하여 AES 암호화/복호화를 쉽게 구현할 수 있습니다.

package com.hyo.util;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
import com.hyo.constant.WebConstants;

public class AesUtil {
	
  private static String privateKey_256 = WebConstants.PRIVATE_KEY;
	
	
  public static String aesCBCEncode(String plainText) throws Exception {
		
    SecretKeySpec secretKey = new SecretKeySpec(privateKey_256.getBytes("UTF-8"), "AES");
    IvParameterSpec IV = new IvParameterSpec(privateKey_256.substring(0,16).getBytes());
		
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
		
    c.init(Cipher.ENCRYPT_MODE, secretKey, IV);
		
    byte[] encrpytionByte = c.doFinal(plainText.getBytes("UTF-8"));
		
    return Hex.encodeHexString(encrpytionByte);
  }

	
  public static String aesCBCDecode(String encodeText) throws Exception {

    SecretKeySpec secretKey = new SecretKeySpec(privateKey_256.getBytes("UTF-8"), "AES");
    IvParameterSpec IV = new IvParameterSpec(privateKey_256.substring(0,16).getBytes());
		
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
		
    c.init(Cipher.DECRYPT_MODE, secretKey, IV);
		
    byte[] decodeByte = Hex.decodeHex(encodeText.toCharArray());
		
    return new String(c.doFinal(decodeByte), "UTF-8");
  }
}


3. 블록 암호화 운영 모드: CBC Mode

CBC 모드는 각 블록의 암호화 결과가 다음 블록의 암호화에 영향을 주는 방식입니다. 이로 인해 동일한 평문 블록이 암호화될 때마다 다른 암호문 블록이 생성됩니다.

IV(Initial Vector)는 암호화의 시작 부분에 사용되는 값으로, 암호화 결과에 무작위성을 추가하는 역할을 합니다. 고정된 IV 값을 사용하는 것은 보안상 좋지 않지만, 편의를 위해 사용할 수 있습니다. 하지만 실제 보안이 중요한 환경에서는 무작위 IV 값을 사용하는 것이 권장됩니다.

 

4. AES 암호화/복호화 결과 확인

암호화와 복호화가 제대로 작동하는지 테스트 코드를 통해 확인합니다.

public static void main(String[] args) throws Exception {
				
  String plainText = "개발자 Aiden 의 하루";
		
  String encData = AesUtil.aesCBCEncode(plainText);
		
  System.out.println("# 암호화 데이터 : " + encData);		
  System.out.println("# 복호화 데이터 : " + AesUtil.aesCBCDecode(encData));
}

-----------------------------------------------------------------------------

# 암호화 데이터 : 66efb73ba12b7434a696dae62d1d10b26ca92cd2173f6689da43c593ae05cc24
# 복호화 데이터 : 개발자 Aiden 의 하루


AES 암호화는 강력한 보안성을 제공하지만, 키 관리와 암호화 모드 선택 등의 세부 사항이 중요합니다. 다음 글에서는 이러한 세부 사항 중 특히 키 관리 전략에 대해 더 자세히 알아보겠습니다.


※ AES-256 암호화 시 Illegal key size 에러 발생 원인 및 해결 방법.

 

[Java] AES-256 암호화 시 java.security.InvalidKeyException: Illegal key size 에러 원인 및 해결 방법

AES-256 암호화 시 InvalidKeyException Illegal key size 에러 원인을 알아보자. ○ Error 발생 시 StackTrace 정보 java.security.InvalidKeyException: Illegal key size at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039) at javax.crypto.Ci

aday7.tistory.com

반응형

댓글


loading