[java] 블록 암호화와 스트림 암호화의 개념

블록 암호화와 스트림 암호화는 암호화 기술에서 주로 사용되는 두 가지 주요 방법이다. 각 방식은 데이터를 암호화하고 복호화하는 방식이 다르며, 각각의 장단점이 있다.

블록 암호화(Block Cipher)

블록 암호화는 고정된 크기의 블록으로 데이터를 처리하는 방식이다. 블록의 크기에 따라 암호화되는 데이터의 크기가 결정되며, 블록 크기에 맞게 데이터가 패딩(padding)될 수도 있다. 블록 암호화는 고정된 횟수의 라운드(round)에 걸쳐 데이터를 암호화하며, 대표적으로 AES(Advanced Encryption Standard)가 있다. 블록 암호화는 ECB(Electronic Codebook), CBC(Cipher Block Chaining), CTR(Counter) 등의 모드가 있다.

// Java에서 블록 암호화 예제
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class BlockCipherExample {
    public static void main(String[] args) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(256);
        SecretKey secretKey = keyGenerator.generateKey();

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal("Hello, World!".getBytes());
    }
}

스트림 암호화(Stream Cipher)

스트림 암호화는 데이터를 연속적인 스트림으로 처리하는 방식이다. 데이터의 각 바이트에 대해 비트 연산을 수행하여 암호화하며, 키 스트림(key stream)을 사용하여 평문과 키 스트림의 XOR 연산을 통해 암호문을 생성한다. 대표적으로 RC4, ChaCha20 등이 있다.

// Java에서 스트림 암호화 예제
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class StreamCipherExample {
    public static void main(String[] args) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("RC4");
        SecretKey secretKey = keyGenerator.generateKey();

        Cipher cipher = Cipher.getInstance("RC4");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.update("Hello, World!".getBytes());
    }
}

결론

각각의 암호화 방식은 데이터 처리 방식과 알고리즘에 따라 장단점이 있으며, 사용 환경에 맞게 적절한 방법을 선택해야 한다. 데이터의 크기, 전송 방식, 보안 요구사항 등을 고려하여 적합한 암호화 방식을 선택해야 한다.

자세한 내용은 다음 참고 자료를 참고할 수 있다.

이상으로 블록 암호화와 스트림 암호화에 대한 개념을 알아보았다. 감사합니다.