암호화 및 복호화 모듈 - 대칭 키 암호화

회사 관련 프로젝트를 하던 도중, 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)

DES64비트 블록 크기를 사용하고, 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 DESDES세 번 적용하여, 보안성을 높인 암호화 알고리즘입니다.

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)

AESDES후속으로 고정된 크기인 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. 정리하며

지금까지 대칭 키 암호화 및 복호화 모듈에 대해 알아보았습니다.

이를 활용해, 값을 암호화 및 복호화하여 사용할 수 있을 것 같아요.

다음 글엔 비대칭 키 암호화 방식에 대한 글로 찾아뵙겠습니다.

 

암호화 및 복호화 모듈 - 비대칭 키 암호화

그러면 이번엔 비대칭 키 암호화의 종류에 대해 알아봅시다. (암호화 및 복호화 모듈 정의와 대칭키 암호화란?) 1. 비대칭 키 암호화(Asymmetric Key Encryption)비대칭 키 암호화는 암호화와 복호화에

newbean-j.tistory.com

 

 

참고

Hyun 님의 암호화 및 복호화란 ? 쉽게 알아보자.

정광섭 님의 대칭 키 암호화

하루한방울 님의 대칭키, 공개키 암호화 방식