대칭키 암호화 (Symmetric Encryption)
대칭키 암호화는 동일한 키를 사용하여 데이터를 암호화하고 복호화하는 방식.
구현 예시:
|
|
주요 특징
- 암호화와 복호화에 같은 키를 사용한다.
- 혼돈(confusion)과 확산(diffusion)의 원리를 이용하여 평문을 암호화한다.
- 주로 치환(substitution)과 순열(permutation) 연산을 포함한 라운드를 반복하는 구조로 설계된다.
- 데이터 변환 방식에 따라 블록 암호와 스트림 암호로 구분된다.
혼돈(confusion)과 확산(diffusion)의 원리
- 혼돈(confusion)
암호문과 키 사이의 관계를 숨기는 것.
키의 단일 비트 변화가 암호문의 많은 비트를 변화시킴.
주로 치환(substitution) 연산을 통해 달성. - 확산(diffusion)
암호문과 평문 사이의 관계를 숨기는 것.
평문의 통계적 특성을 암호문 전체에 분산시킴.
주로 순열(permutation) 연산을 통해 달성.
|
|
라운드 반복 구조
치환과 순열 연산을 포함한 기본 구조(라운드)를 여러 번 반복하는 방식.
특징
- 각 라운드는 S-box(치환), P-box(순열), 그리고 기타 연산으로 구성.
- 반복을 통해 혼돈과 확산 효과를 강화
|
|
블록 암호와 스트림 암호
블록 암호
고정된 크기의 블록 단위로 데이터를 암호화
특징:
- 한 번에 여러 비트를 처리.
- 패딩이 필요할 수 있음1 2 3 4 5 6 7 8 9 10
def simple_block_cipher_encrypt(plaintext, key): # 간단한 블록 암호 예시: 각 블록에 대해 키와 XOR 연산 수행 return [p ^ k for p, k in zip(plaintext, key)] # 예시 평문과 키 (블록 단위로 처리) plaintext_block = [72, 101, 108, 108, 111] # 'Hello'의 ASCII 코드 key_block = [1, 2, 3, 4, 5] # 간단한 키 # 블록 암호화 수행 ciphertext_block = simple_block_cipher_encrypt(plaintext_block, key_block)
스트림 암호
데이터를 비트 또는 바이트 단위로 순차적으로 암호화.
특징:
- 실시간 처리에 적합
- 키 스트림 생성이 중요.1 2 3 4 5 6 7 8 9 10 11
def simple_stream_cipher_encrypt(plaintext, key): # 간단한 스트림 암호 예시: 키 스트림 생성 후 XOR 연산 수행 keystream = (key[i % len(key)] for i in range(len(plaintext))) return [p ^ k for p, k in zip(plaintext, keystream)] # 예시 평문과 키 plaintext_stream = [72, 101, 108, 108, 111] # 'Hello'의 ASCII 코드 key_stream = [1, 2, 3] # 간단한 키 # 스트림 암호화 수행 ciphertext_stream = simple_stream_cipher_encrypt(plaintext_stream, key_stream)
장점
- 빠른 처리 속도: 공개키 암호화 방식에 비해 암호화와 복호화 속도가 빠르다.
- 효율성: 대용량 데이터 처리에 적합하다.
- 구현의 용이성: 알고리즘 구조가 상대적으로 단순하여 구현이 쉽다.
- 적은 자원 사용: 연산 자원이 적게 소모되어 저전력 환경이나 IoT 장치에서도 사용 가능하다.
단점
- 키 분배 문제: 안전한 키 전달과 관리가 어렵다.
- 확장성 문제: 다수의 사용자 간 통신 시 관리해야 할 키의 수가 급증한다.
- 키의 안전성 의존: 키가 노출되면 모든 암호화된 데이터가 위험에 처할 수 있다.
- 디지털 서명 적용의 어려움: 비대칭키 방식에 비해 디지털 서명 기법 적용이 어렵다.
사용 사례
- 대용량 데이터 암호화: 효율성이 중요한 경우에 사용된다.
|
|
- 폐쇄된 시스템 내 내부 통신 보호.
- 디스크 전체 암호화: Windows의 BitLocker, OS X의 FileVault 등.
- 통신 채널 보호: TLS 프로토콜에서 데이터 암호화에 사용된다.
|
|
- 실시간 데이터 처리: 라이브 동영상 스트리밍 서비스 등.