개발 기록이

[JAVA] Base64 인코딩을 이용해서 암복호화하기 본문

웹 개발/Back-end

[JAVA] Base64 인코딩을 이용해서 암복호화하기

studyingbackhoe 2025. 2. 9. 16:16

1. AES 알고리즘

대칭키 암호화 방식으로 암호화와 복호화에 동일한 키를 사용한다. 이 키는 비밀로 유지되어야 하며 암호화된 데이터는 키를 알고 있는 사람만 복호화할 수 있다. AES 알고리즘 중 AES-256을 사용하여 256비트(32바이트) 키로 더 강력한 보안 방법을 적용해보려고 한다.
 

2. 암복호화하기

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

public class CipherExample {

	public static void main(String[] args) throws Exception {

		// AES-256을 사용하려면 키 길이가 32바이트(256비트)여야 함.
		String myKey = "[개발|기록이|AES|암호화]";
		int bytesLength = myKey.getBytes().length;
		System.err.println("myKey 바이트 값 ::: " + bytesLength);
		
		// myKey값이 32바이트가 아닌 경우 32바이트로 변환
                /* if (myKey.getBytes().length < 32) {
                    while (myKey.getBytes().length < 32) {
                        myKey += "\0"; 
                    }
                }
		System.err.println("myKey를 32바이트로 변환 ::: " + myKey.getBytes().length); */
	        
		SecretKeySpec key = new SecretKeySpec(myKey.getBytes(), "AES");
		String email = "studyingbackhoe@test.com";
		String encrypt = encrypt(email, key);
		System.err.println("암호화 >>> " + encrypt);

		String decrypt = decrypt(encrypt, key);
		System.err.println("복호화 >>> " + decrypt);
	}
	
	// 암호화
	public static String encrypt(String data, SecretKeySpec key) throws Exception {
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(Cipher.ENCRYPT_MODE, key);
		byte[] encryptedBytes = cipher.doFinal(data.getBytes());
		return Base64.getEncoder().encodeToString(encryptedBytes);
	}
	
	// 복호화
	public static String decrypt(String encryptData, SecretKeySpec key) throws Exception {
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(Cipher.DECRYPT_MODE, key);
		byte[] encryptedBytes = Base64.getDecoder().decode(encryptData);
		byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
		return new String(decryptedBytes);
	}
}

 
1) SecretKeySpec

  • AES 알고리즘에서 사용할 비밀키를 생성한다.
  • AES-256 방식을 사용하기 위해서는 myKey의 길이는 32바이트(256비트)여야 한다.

2) Cipher.getInstance("AES")

  • AES 암복호화를 위한 Cipher 객체를 생성한다.
  • 이 Cipher 객체는 나중에 실제로 암호화 및 복호화 작업을 수행하는 데 사용된다.

3) cipher.init(Cipher.ENCRYPT_MODE, key)

  •  init() 메서드는 Cipher 객체를 초기화하는 역할을 한다.
  • (Cipher.ENCRYPT_MODE : 암호화 모드)

4) cipher.doFinal(data.getBytes())

  • doFinal() 메서드는 암호화 작업을 실제로 수행한다.
  • data.getBytes()로 변환된 원본 데이터를 암호화하여 encryptedBytes에 저장한다.
  • 이때 반환된 encryptedBytes는 암호화된 바이트 배열이다.

 
5)  Base64.getEncoder().encodeToString(encryptedBytes) 

  • 암호화된 바이트 배열인 encryptedBytes를 Base64 인코딩하여 문자열로 변환한다.
  • 반환된 값은 암호화된 데이터를 Base64 인코딩한 문자열이다.

* Base64 인코딩을 사용하는 이유
  바이트 배열을 텍스트로 변환하여 저장하거나 전송할 때 더 편리하게 사용하기 위함.
 

6) Base64.getDecoder().decode(encryptedData) 

  • Base64 디코딩하여 바이트 배열로 변환한다. 암호화된 데이터를 복호화하려면 먼저 Base64에서 원래의 바이트 배열로 변환해야 한다.
  • encryptedBytes는 디코딩된 암호화된 바이트 배열이다.

 

3. 실행 결과

 


출처 : OpenAI ChatGPT (https://openai.com)