Skip to content

Commit

Permalink
[Merge] main <- wonjeong#147-fix-change-aes-mode
Browse files Browse the repository at this point in the history
[Fix] AES-CBC 모드를 사용하여 보안성을 높였습니다
  • Loading branch information
NARUBROWN authored Oct 15, 2024
2 parents 8091282 + f7151e2 commit c57b55b
Showing 1 changed file with 40 additions and 15 deletions.
55 changes: 40 additions & 15 deletions src/main/java/me/snaptime/util/EncryptionUtil.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package me.snaptime.util;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;

public class EncryptionUtil {
public static SecretKey generateAESKey() throws Exception {
Expand All @@ -11,23 +15,44 @@ public static SecretKey generateAESKey() throws Exception {
return keyGenerator.generateKey();
}

public static byte[] encryptData(byte[] dataToEncrypt, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
/*
Cipher 클래스는 JCA의 일부로 암호화 및 복호화 연산을 위한 기능을 제공한다.
Cipher 인스턴스는 getInstance(String algorithm) 메소드를 호출해 생성할 수 있다.
이 코드에서는 AES를 매개변수로 제공해 AES 암호화 알고리즘을 사용하는 Cipher 객체를 생성하고 있다.
*/
Cipher cipher = Cipher.getInstance("AES");
// cipher 인스턴스를 암호화 모드로 초기화한다.
cipher.init(Cipher.ENCRYPT_MODE, key);
// doFinal 메소드를 호출해 암호화 연산을 완료한다.
return cipher.doFinal(dataToEncrypt);
public static byte[] encryptData(byte[] dataToEncrypt, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

// 16바이트의 초기화 벡터(IV)를 생성한다.
byte[] iv = new byte[16];
SecureRandom random = new SecureRandom();
random.nextBytes(iv);
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

// 암호화 모드로 초기화
cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);

// 데이터 암호화
byte[] encryptedData = cipher.doFinal(dataToEncrypt);

// IV와 암호화된 데이터를 하나로 결합하여 반환 (복호화 시 IV가 필요하기 때문에)
byte[] result = new byte[iv.length + encryptedData.length];
System.arraycopy(iv, 0, result, 0, iv.length);
System.arraycopy(encryptedData, 0, result, iv.length, encryptedData.length);

return result;
}

public static byte[] decryptData(byte[] encryptedData, SecretKey secretKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(encryptedData);
public static byte[] decryptData(byte[] encryptedData, SecretKey secretKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

// 암호화된 데이터의 앞부분에서 IV를 추출한다.
byte[] iv = Arrays.copyOfRange(encryptedData, 0, 16);
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

// 나머지 부분이 실제 암호화된 데이터
byte[] actualEncryptedData = Arrays.copyOfRange(encryptedData, 16, encryptedData.length);

// 복호화 모드로 초기화
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);

// 데이터 복호화
return cipher.doFinal(actualEncryptedData);
}

}

0 comments on commit c57b55b

Please sign in to comment.