암호는 안전하지 않은 채널을 통해 정보를 주고받더라도 제3자가 내용을 알 수 없도록 보호하는 기술이다.
기본 개념
- 평문 (Plaintext): 원래의 메시지
- 암호문 (Ciphertext): 코드화된 메시지
- 암호화 (Encryption): 평문 → 암호문
- 복호화 (Decryption): 암호문 → 평문
- 키 (Key): 암호화 및 복호화를 위한 중요한 값
- Kerckhoff의 원리: 암호 알고리즘이 알려져도 키를 모르면 해독할 수 없도록 설계해야 한다.
암호의 역사
고대 암호
- 스테가노그래피 (Steganography): 메시지 자체를 숨기는 기법 (ex. 나무판에 조각 후 밀랍으로 덮어 전달)
- 전치법 (Transposition Cipher): 문자의 순서를 바꿔 암호화 (ex. 애너그램)
- 치환법 (Substitution Cipher): 문자를 다른 문자로 대체 (ex. 시저 암호, 시프트 암호)
근대 암호
- 비즈네르 암호: 시프트 암호를 여러 개의 키로 확장한 다중 치환 암호
- 1949년 새넌의 암호 이론: 암호 설계의 두 가지 원칙 제시
- 혼돈 (Confusion): 평문과 암호문의 상관관계를 숨김
- 확산 (Diffusion): 평문의 특정 패턴이 암호문 전체에 분산되도록 함
현대 암호
1. 대칭키 암호 (Symmetric Key Encryption)
- 특징: 암호화와 복호화에 같은 키를 사용
- 장점: 속도가 빠름
- 단점: 키를 안전하게 공유하는 키 분배 문제 존재
- 대표 알고리즘:
- DES (Data Encryption Standard): 1977년 미국 표준 암호 알고리즘 (이후 AES로 대체)
- AES (Advanced Encryption Standard): 2001년 표준이 된 강력한 블록 암호
- IDEA (International Data Encryption Algorithm)
대칭키 암호의 분류
1. 블록 암호 (Block Cipher)
블록 암호는 평문을 고정된 크기의 블록 단위로 나누어 암호화하는 방식입니다.
예를 들어, 평문이 길다면 각 블록(예: 128비트 단위) 별로 암호화를 수행하여 암호문 블록을 생성합니다.
특징
- 입력 블록의 모든 비트가 키와 결합하여 출력 블록을 생성 → 즉, 입력 블록의 모든 비트가 영향을 받음
- 암호화 강화를 위해 단순한 함수를 여러 번 반복 적용
- 반복되는 함수를 라운드 함수라고 하며, 각 라운드에서 사용되는 키를 라운드 키라고 함
블록 암호의 주요 개념
- 라운드 함수 (Round Function)
- 블록 암호에서는 한 번의 암호화 과정만 거치는 것이 아니라 여러 번 반복하여 암호화합니다.
- 이때, 반복적으로 적용되는 함수를 라운드 함수라고 합니다.
- 예를 들어, AES는 10~14번의 라운드를 수행합니다.
- 라운드 키 (Round Key)
- 라운드 함수에서 각 단계마다 사용되는 키를 의미합니다.
- 처음 주어진 키에서 라운드별로 다른 키를 생성하여 사용합니다.
- 키 스케줄 (Key Schedule)
- 라운드 키를 생성하는 과정입니다.
- 즉, 하나의 키를 기반으로 여러 개의 라운드 키를 만들어내는 과정이라고 보면 됩니다.
대표적인 블록 암호 알고리즘
- AES (Advanced Encryption Standard)
- 현재 가장 널리 사용되는 강력한 블록 암호
- 128비트 블록 크기를 사용하며, 128/192/256비트 키 길이를 지원
- SPN 구조 사용 (이후 설명)
- DES (Data Encryption Standard)
- 과거에 사용되던 암호화 방식 (현재는 보안성이 약해짐)
- 64비트 블록 크기, 56비트 키 길이
- 파이스텔 구조 사용 (이후 설명)
2. 블록 암호의 구조
블록 암호의 내부 구조는 크게 파이스텔 구조와 SPN 구조로 나뉩니다.
2.1 파이스텔 구조 (Feistel Structure)
DES와 같은 블록 암호에서 사용되는 구조입니다.
입력 블록을 두 개의 절반으로 나누어 여러 번 변환하는 방식입니다.
파이스텔 구조의 과정
- 평문을 왼쪽(L)과 오른쪽(R) 두 부분으로 나눔
- 오른쪽 부분(R)을 키와 함께 특정 함수(F)에 적용하여 변환
- 변환된 값을 왼쪽 부분(L)과 XOR 연산
- 왼쪽과 오른쪽 부분을 서로 교환
- 이 과정을 여러 번 반복하여 암호화
특징:
- 복호화 과정이 암호화 과정과 거의 동일 (거꾸로 적용하면 됨)
- DES에서 사용됨
2.2 SPN 구조 (Substitution-Permutation Network)
AES와 같은 블록 암호에서 사용되는 구조입니다.
치환(Substitution)과 순열(Permutation)을 반복하여 보안을 강화하는 방식입니다.
SPN 구조의 과정 (간단하게)
- 입력 블록을 작은 부분(예: 바이트 단위)으로 나눔
- 각 부분을 다른 값으로 치환 (Substitution, 대체)
- 값들을 섞어서 재배열 (Permutation, 위치 변경)
- 키를 XOR 연산으로 적용
- 이 과정을 여러 번 반복하여 암호화
특징:
- S-box (대체), P-box (섞기) 등으로 구성됨
- AES에서 사용됨
- 파이스텔 구조보다 복잡하지만 더 강력함
3. 블록 암호의 사용 모드 (Operation Mode)
블록 암호는 기본적으로 고정된 크기의 블록을 암호화하지만, 실제 데이터는 길이가 다양하기 때문에 **여러 가지 암호화 방식(모드)**을 사용할 수 있습니다.
3.1 전자 코드북 (ECB, Electronic Codebook) 모드
동작 방식:
- 각 블록을 독립적으로 암호화
- 같은 평문 블록 → 같은 암호문 블록
문제점:
- 같은 입력 블록은 같은 출력 블록이 되므로 패턴이 노출될 위험이 큼
- 보안성이 낮아 잘 사용되지 않음
3.2 암호 블록 연결 (CBC, Cipher Block Chaining) 모드
동작 방식:
- 이전 블록의 암호문을 현재 블록의 평문과 XOR 연산 후 암호화
- 첫 번째 블록에는 **초기 벡터(IV)**를 사용
장점:
- 같은 평문 블록이라도 각각 다른 암호문 블록이 생성됨 (ECB 단점 보완)
단점:
- 암호화는 병렬 처리 불가능 (순차적으로 진행)
3.3 암호 피드백 (CFB, Cipher Feedback) 모드
동작 방식:
- 블록 암호를 스트림 암호처럼 사용
- 이전 암호문 블록을 암호화하여 키 스트림을 생성하고 평문과 XOR
장점:
- 실시간 데이터 암호화 가능
단점:
- 한 비트만 손상되어도 이후 모든 데이터가 깨질 위험 있음
3.4 출력 피드백 (OFB, Output Feedback) 모드
동작 방식:
- CBC와 달리 피드백을 평문 대신 키 스트림을 생성하는 방식으로 사용
- 키 스트림과 평문을 XOR하여 암호문 생성
장점:
- 오류가 전파되지 않음
단점:
- 키 스트림이 재사용되면 보안 취약
3.5 카운터 (CTR, Counter) 모드
동작 방식:
- 각 블록에 카운터 값을 암호화하여 키 스트림 생성 후 평문과 XOR
- 암호화 및 복호화 시 동일한 카운터 값을 사용
장점:
- 병렬 처리 가능 → 빠른 속도
단점:
- 같은 카운터 값이 반복되면 보안 취약
1. 스트림 암호 (Stream Cipher)
블록 단위가 아니라, 평문과 같은 길이의 "키 스트림"을 생성하여 XOR 연산하는 방식
특징:
- 키 스트림을 비트 단위로 XOR 연산하여 암호화
- 빠르고 간단하지만, 키 스트림이 예측 가능하면 보안이 깨짐
- 예측할 수 없는 랜덤 수열을 생성해야 함
4.1 대표적인 스트림 암호
- RC4: 가장 널리 사용된 스트림 암호 (현재는 보안 취약)
- 선형 귀환 시프트 레지스터 (LFSR, Linear Feedback Shift Register)
- 특정 패턴 없이 난수를 생성하는 알고리즘
1. 공개키 암호(Public Key Encryption)
공개키 암호는 암호화와 복호화에 서로 다른 키를 사용하는 방식입니다.
즉, **공개키(Public Key)와 개인키(Private Key)**라는 두 개의 키를 사용합니다.
공개키 (Public Key)
- 누구나 사용할 수 있는 키
- 메시지를 암호화하는 용도로 사용됨
개인키 (Private Key)
- 오직 본인만 가지고 있는 키
- 암호화된 메시지를 복호화하는 데 사용됨
예시:
- 친구가 내 공개키를 이용해 메시지를 암호화해서 보냄
- 나는 내 개인키로만 복호화할 수 있음 (제3자는 해독 불가능)
장점:
- 키 공유 문제 해결 (공개키는 모두가 알 수 있으므로, 대칭키처럼 비밀리에 전달할 필요가 없음)
단점:
- 대칭키 암호보다 속도가 느림 (수학적으로 복잡한 연산을 수행하기 때문)
2. 대표적인 공개키 암호 알고리즘
공개키 암호 방식 RSA, ECC, ElGamal 등
2.1 RSA (Rivest-Shamir-Adleman)
핵심 원리:
소인수분해의 어려움을 기반으로 한 암호 알고리즘
RSA 암호화 과정
1️⃣ 두 개의 큰 소수(Prime Number) 선택
- 예를 들어, p는 61, q는 53 같은 두 개의 큰 소수를 선택
2️⃣ 두 소수를 곱하여 N 계산
- N은 p 곱하기 q, 즉 61 곱하기 53은 3233
- 이 N은 공개키의 일부로 사용됨
3️⃣ 공개키와 개인키 생성
- 공개키는 e와 N으로 구성됨
- 개인키는 d와 N으로 구성됨
4️⃣ 메시지 암호화
- 평문을 숫자로 변환 후 공개키로 암호화
- C는 M의 e제곱을 N으로 나눈 나머지
- 예를 들어, M이 65이고 e가 17일 때
C는 65의 17제곱을 3233으로 나눈 나머지
5️⃣ 복호화
- 암호문을 개인키로 복호화
- M은 C의 d제곱을 N으로 나눈 나머지
RSA의 특징
보안성: 소인수분해가 매우 어렵기 때문에 안전함
단점: 키 길이가 길어질수록 연산 속도가 느려짐
실제 사용 예시:
- 웹사이트 보안 (HTTPS, SSL/TLS)
- 이메일 암호화 (PGP)
2.2 ECC (Elliptic Curve Cryptography)
핵심 원리:
타원곡선 이론을 이용하여 짧은 키로도 높은 보안 제공
RSA보다 더 짧은 키 길이로 동일한 보안성을 제공하기 때문에 현대 암호화에서 선호됩니다.
ECC 암호화 과정
1️⃣ 타원 곡선 선택
- 예를 들어, y의 제곱은 x의 세제곱 더하기 ax 더하기 b 같은 방정식을 이용하여 곡선 정의
2️⃣ 기본 연산 수행
- 타원 곡선 위의 점을 사용하여 암호화 연산 수행
- 특정한 점 G를 여러 번 더하여 키를 생성 (이산 로그 문제와 유사)
3️⃣ 암호화 및 복호화
- 특정 점을 기준으로 연산하여 메시지를 변환
ECC의 특징
RSA보다 짧은 키 길이로 동일한 보안성 제공
연산이 빠름 (모바일 기기 등에 적합)
실제 사용 예시:
- 비트코인 및 블록체인
- 모바일 기기 및 IoT 보안
2.3 ElGamal 암호화
핵심 원리:
이산 로그 문제의 어려움을 기반으로 한 암호 알고리즘
RSA와 마찬가지로 공개키 암호화 방식이지만, 서명 기능도 지원하는 특징이 있습니다.
ElGamal 암호화 과정
1️⃣ 큰 소수 p 선택
- 공개적으로 사용할 큰 소수 p 선택
2️⃣ 공개키와 개인키 생성
- 공개키: 특정 수 g (생성원)과 그 거듭제곱을 공개
- 개인키: 개인이 아는 비밀 값 x
3️⃣ 암호화
- 난수 k를 생성하여 메시지를 암호화
4️⃣ 복호화
- 개인키 x를 사용하여 원래 메시지를 복원
ElGamal의 특징
보안성이 높음 (이산 로그 문제 기반)
디지털 서명에 사용 가능
단점: 암호문 크기가 커지는 경향이 있음
실제 사용 예시:
- PGP (Pretty Good Privacy) 암호화
- 디지털 서명 시스템
암호의 발전 방향
- 양자 암호 (Quantum Cryptography): 양자 컴퓨팅 시대를 대비한 새로운 암호화 기법 연구
- 동형 암호 (Homomorphic Encryption): 암호화된 데이터 상태에서 연산이 가능하도록 하는 기술
- 블록체인 기반 암호 기술: 분산 환경에서의 보안을 위한 암호 기법 적용