회사 관련 프로젝트를 하던 도중, Java에서 사용자의 id를 암호화로 받아온 뒤, 암호화된 id를 복호화 시키는 작업이 필요했습니다.
그러한 과정을 거칠 수 있는 암호화 및 복호화 모듈에 대해 알아봅시다.
1. 암호화 및 복호화 모듈이란?
암호화 및 복호화 모듈은 데이터를 보호하고, 기밀성을 유지하며, 무결성을 보장하기 위해 사용되는 도구에요.
암호화(Encryption)는 데이터를 이해할 수 없는 형태로 변환하여, 인가되지 않은 사용자가 데이터를 읽지 못하게 하는 과정이며, 복호화(Decryption)는 암호화된 데이터를 원래의 형태로 변환하는 과정입니다.
2. Java 암호화 및 복호화모듈
Java에서 암호화 및 목보화 모듈은 일반적으로 javax.crypto 패키지를 통해 수행됩니다.
이 패키지는 다양한 암호화 알고리즘, 키 생성, 비밀 키 및 공개 키 관리, 디지털 서명 등을 지원하는 여러 클래스를 포함하고 있습니다.
JCA(Java Cryptography Architecture)와 JCE(Java Cryptography Extension)는 Java 플랫폼에서 암호화 관련 기능을 제공하는 주요 프레임워크 입니다.
3. 대칭 키 암호화(Symmetric Key Encryption)
Java에서는 다양한 암호화 및 복호화 알고리즘을 사용할 수 있어요.
그 중에서 대칭 키 암호화는 암호화와 복호화에 동일한 키를 사용하는 방식입니다.
속도가 빠르고 효율적이지만, 키 관리가 중요한 단점으로 작용해요.
주요 알고리즘으로는 다음과 같습니다.
3-1. DES(Data Encryption Standard)
DES는 64비트 블록 크기를 사용하고, 56비트의 키를 사용하여 데이터를 암호화합니다.
하지만, 이는 기술의 발전으로 인해 56비트의 키의 짧은 길이는 쉽게 해킹될 수 있어 현재는 잘 사용하지 않고 있습니다.
사용 방법은 다음과 같습니다.(javax.crypto 패키지를 사용했습니다.)
DES.java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class DESEncryption {
public static void main(String[] args) throws Exception {
// 키 생성
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
keyGen.init(56); // DES 키 길이
SecretKey secretKey = keyGen.generateKey();
// 암호화
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] plaintext = "DES Test".getBytes();
byte[] ciphertext = cipher.doFinal(plaintext);
// 복호화
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedText = cipher.doFinal(ciphertext);
System.out.println(new String(decryptedText)); // "DES Test"
}
}
3-2.Triple DES(Triple Data Encryption Standard)
Triple DES는 DES를 세 번 적용하여, 보안성을 높인 암호화 알고리즘입니다.
64비트의 블록 단위로 데이터를 처리하며, 56비트의 키를 가진 DES를 세 번 적용하였기에, 총 168비트의 키 길이를 가집니다.
하지만, 두 번째 키가 첫 번째 키와 동일할 경우, 112비트로 감소해요.
이는 DES보다 훨씬 더 안전하지만, 현재 컴퓨터 파워를 감당하기엔 여전히 취약점이 발견되었습니다.
사용 방법은 다음과 같습니다.(javax.crypto 패키지를 사용했습니다.)
TripleDES.java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class TripleDESEncryption {
public static void main(String[] args) throws Exception {
// 3DES 키 생성
KeyGenerator keyGen = KeyGenerator.getInstance("DESede");
keyGen.init(168); // 3DES 키 길이
SecretKey secretKey = keyGen.generateKey();
// 암호화
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] plaintext = "3DES Test".getBytes();
byte[] ciphertext = cipher.doFinal(plaintext);
// 복호화
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedText = cipher.doFinal(ciphertext);
System.out.println(new String(decryptedText)); // "3DES Test"
}
}
3-3. Blowfish
Blowfish는 64비트의 블록 단위로 데이터를 처리하며, 32비트에서 448비트까지의 유연한 키 길이를 지원합니다.
이는 보안성이 높아 현재까지도 안전하다고 여겨지는 경우도 있지만, 64비트의 블록 크기 때문에, 대용량 데이터에 대한 암호화에서는 이론적인 공격에 취약할 수 있다는 단점이 있어요.
사용 방법은 다음과 같습니다.(javax.crypto 패키지를 사용했습니다.)
Blowfish.java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class BlowfishEncryption {
public static void main(String[] args) throws Exception {
// 키 생성
KeyGenerator keyGen = KeyGenerator.getInstance("Blowfish");
keyGen.init(128); // Blowfish 키 길이 (32비트에서 448비트까지 가능)
SecretKey secretKey = keyGen.generateKey();
// 암호화
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] plaintext = "Blowfish Test".getBytes();
byte[] ciphertext = cipher.doFinal(plaintext);
// 복호화
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedText = cipher.doFinal(ciphertext);
System.out.println(new String(decryptedText)); // "Blowfish Test"
}
}
3-4. AES(Advanced Encryption Standard)
AES는 DES의 후속으로 고정된 크기인 128비트의 블록 단위로 데이터를 처리하며, 128비트, 192비트, 256비트의 세 가지 키 길이를 지원하여 DES보다 훨씬 안전해 현재까지도 널리 사용되고 있는 표준 암호화 알고리즘입니다.
사용 방법은 다음과 같습니다.(javax.crypto 패키지를 사용했습니다.)
AES.java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class AESEncryption {
public static void main(String[] args) throws Exception {
// 키 생성
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // AES 키 길이 (128, 192, 256 비트 중 선택)
SecretKey secretKey = keyGen.generateKey();
// 암호화
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] plaintext = "AES Test".getBytes();
byte[] ciphertext = cipher.doFinal(plaintext);
// 복호화
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedText = cipher.doFinal(ciphertext);
System.out.println(new String(decryptedText)); // "AES Test"
}
}
4. 정리하며
지금까지 대칭 키 암호화 및 복호화 모듈에 대해 알아보았습니다.
이를 활용해, 값을 암호화 및 복호화하여 사용할 수 있을 것 같아요.
다음 글엔 비대칭 키 암호화 방식에 대한 글로 찾아뵙겠습니다.
참고
'Programming Language > Java' 카테고리의 다른 글
암호화 및 복호화 모듈 - 비대칭 키 암호화 (2) | 2024.09.04 |
---|---|
AES를 활용해 암호화 및 복호화하기 (0) | 2024.09.03 |
try-with-resources (0) | 2024.08.02 |
오류가 발생한 엑셀 csv 파일의 열 찾기 (0) | 2024.07.30 |
BuffredReader - 엑셀 불러오기 (3) | 2024.07.23 |