목차
- 자바 소스 코드 컴파일 명령 javac 예제 이전 포스팅
- 자바 random 활용 AES 암호화 랜덤 키 생성 예제 이전 포스팅
- C언어 Openssl 활용 AES 암복호와 예제 이전 포스팅
- 자바 AES 256 암호화에 사용할 랜덤 키 문자열 생성 예제
- 자바 AES 256 문자열 암호화 예제
- 자바 AES 256 암호문 복호화 예제
자바 소스 코드 컴파일 명령 javac 예제 이전 포스팅
오늘의 포스팅 주제는 자바에서 AES 256 ECB모드로 암복호화하는 예제입니다. 암호문이란 우리가 흔히 알아보고 뜻을 이해할 수 있는 문장인 평문을 특별한 Key로 암호화하여 Key가 없으면 알아볼 수 없는 형태의 문장으로 바꾼 문장입니다. 예전 포스팅에서는 C언어에서 AES 암복호화하는 방법을 알아보았으나 오늘은 자바에서 암복호화하는 예제를 알아보겠습니다.
오늘 예제를 실행하기에 앞서 자바 소스 코드 컴파일 방법을 모르신다면 아래 링크를 참고하여 학습해주세요.
2023.08.10 - [Linux] - [Linux/Java] 리눅스 우분투에서 java 컴파일 및 실행 예제(javac)
자바 random 활용 AES 암호화 랜덤 키 생성 예제 이전 포스팅
오늘 AES 암복호화에 있어서 꼭 필요한 키가 있습니다. 이 키는 AES 256의 경우 총 길이 32Byte를 가져야합니다. 오늘은 이전 포스팅에서 다룬 랜덤 문자열 생성 알고리즘을 활용하여 AES 암복호화 키 32길이의 문장을 만들어보겠습니다.
아래는 랜덤활용 예제를 다룬 이전 포스팅 링크입니다.
2023.08.17 - [Java] - [Java/Linux] 자바 랜덤 메소드 활용 사용자 비밀번호 생성 예제(SecureRandom)
C언어 Openssl 활용 AES 암복호와 예제 이전 포스팅
또한 C 혹은 C++ 언어 환경에서 AES 256 암복호화 방법이 궁금하신 분은 이전에 다룬 포스팅을 참고하시면 됩니다. 리눅스 우분투 환경에서 codelite로 openssl 정적라이브러리를 링크하여 AES 256 암복호화를 수행하는 예제입니다. 아래 링크를 참고해주세요.
2023.07.28 - [C] - [C/C++] Openssl 활용 AES256 암호화 및 복호화 예제 - 2(ECB암호화 및 체인 종류)
자바 AES 256 암호화에 사용할 랜덤 키 문자열 생성 예제
아래는 자바에서 AES 256 암호화에 사용할 랜덤 키를 생성하는 예제입니다.
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
public class Example {
private static final String LOWERCASE = "abcdefghijklmnopqrstuvwxyz";
private static final String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String SPECIALCHARS = "!@#$%^&*()-_=+[]{}|;:,.<>?";
private static final String AES_ALGORITHM = "AES";
private static final String AES_MODE = "AES/ECB/PKCS5Padding";
public static String generateRandomPassword() {
SecureRandom random = new SecureRandom();
List<String> characters = new ArrayList<>();
characters.add(LOWERCASE);
characters.add(UPPERCASE);
characters.add(SPECIALCHARS);
StringBuilder passwordBuilder = new StringBuilder();
while (passwordBuilder.length() < 32) {
String randomCharacterList = characters.get(random.nextInt(characters.size()));
int randomIndex = random.nextInt(randomCharacterList.length());
char randomChar = randomCharacterList.charAt(randomIndex);
passwordBuilder.append(randomChar);
}
return passwordBuilder.toString();
}
public static void main(String[] args) throws Exception {
String plainText = "Hello, AES in ECB mode!";
String key = generateRandomPassword();
System.out.println("Plain Text: " + plainText);
System.out.println("Key: " + key);
}
}
자바 AES 256 문자열 암호화 예제
아래는 자바에서 AES 256으로 평문을 암호화하는 예제입니다.
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Example {
private static final String LOWERCASE = "abcdefghijklmnopqrstuvwxyz";
private static final String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String SPECIALCHARS = "!@#$%^&*()-_=+[]{}|;:,.<>?";
private static final String AES_ALGORITHM = "AES";
private static final String AES_MODE = "AES/ECB/PKCS5Padding";
public static String generateRandomPassword() {
SecureRandom random = new SecureRandom();
List<String> characters = new ArrayList<>();
characters.add(LOWERCASE);
characters.add(UPPERCASE);
characters.add(SPECIALCHARS);
StringBuilder passwordBuilder = new StringBuilder();
while (passwordBuilder.length() < 32) {
String randomCharacterList = characters.get(random.nextInt(characters.size()));
int randomIndex = random.nextInt(randomCharacterList.length());
char randomChar = randomCharacterList.charAt(randomIndex);
passwordBuilder.append(randomChar);
}
return passwordBuilder.toString();
}
public static void main(String[] args) throws Exception {
String plainText = "Hello, AES in ECB mode!";
String key = generateRandomPassword();
System.out.println("Plain Text: " + plainText);
System.out.println("Key: " + key);
// Encrypt
String encryptedText = encryptAESECB(plainText, key);
System.out.println("Encrypted Text: " + encryptedText);
}
public static String encryptAESECB(String plainText, String key) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), AES_ALGORITHM);
Cipher cipher = Cipher.getInstance(AES_MODE);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
}
자바 AES 256 암호문 복호화 예제
아래는 자바에서 AES 256으로 암호문을 복호화하는 예제입니다.
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Example {
private static final String LOWERCASE = "abcdefghijklmnopqrstuvwxyz";
private static final String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String SPECIALCHARS = "!@#$%^&*()-_=+[]{}|;:,.<>?";
private static final String AES_ALGORITHM = "AES";
private static final String AES_MODE = "AES/ECB/PKCS5Padding";
public static String generateRandomPassword() {
SecureRandom random = new SecureRandom();
List<String> characters = new ArrayList<>();
characters.add(LOWERCASE);
characters.add(UPPERCASE);
characters.add(SPECIALCHARS);
StringBuilder passwordBuilder = new StringBuilder();
while (passwordBuilder.length() < 32) {
String randomCharacterList = characters.get(random.nextInt(characters.size()));
int randomIndex = random.nextInt(randomCharacterList.length());
char randomChar = randomCharacterList.charAt(randomIndex);
passwordBuilder.append(randomChar);
}
return passwordBuilder.toString();
}
public static void main(String[] args) throws Exception {
String plainText = "Hello, AES in ECB mode!";
String key = generateRandomPassword();
System.out.println("Plain Text: " + plainText);
System.out.println("Key: " + key);
// Encrypt
String encryptedText = encryptAESECB(plainText, key);
System.out.println("Encrypted Text: " + encryptedText);
// Decrypt
String decryptedText = decryptAESECB(encryptedText, key);
System.out.println("Decrypted Text: " + decryptedText);
}
public static String encryptAESECB(String plainText, String key) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), AES_ALGORITHM);
Cipher cipher = Cipher.getInstance(AES_MODE);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decryptAESECB(String encryptedText, String key) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), AES_ALGORITHM);
Cipher cipher = Cipher.getInstance(AES_MODE);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
return new String(decryptedBytes);
}
}