대칭키 암호화는 암호화와 복호화에 동일한 키를 사용하는 암호화 방식이다.
이 방식에서는 동일한 키로 데이터를 암호화하고, 다시 그 동일한 키로 복호화할 수 있다. 중요한 점은 이 비밀키를 안전하게 공유하는 것이며, 이를 소홀히 할 경우 보안에 치명적인 위험이 발생할 수 있다.
대칭키 암호화의 주요 특징:
한 번에 한 블록씩 고정된 크기의 데이터를 입력으로 받아 암호화한 후, 동일한 크기의 블록을 출력하는 방식이다.
DES, 3DES, AES
설계 요소 | 성능 |
---|---|
블록 크기 | 클수록 강력 |
키 크기 | 클수록 강력 |
라운드 수 | 클수록 강력 |
서브키 생성 알고리즘 | 복잡할수록 강력 |
라운드 함수 | 복잡할수록 강력 |
알고리즘의 구조 | 간결해야함 |
데이터를 연속적인 흐름(stream) 으로 처리하며, 한 번에 한 비트 또는 한 바이트씩 암호화한다.
실시간 데이터 처리에 적합하며, 주로 통신에서 많이 사용된다.
암호 해독은 암호화된 데이터를 키 없이 해독하려는 시도를 의미하며, 다양한 공격 기법이 존재한다.
Brute-force Attack (무차별 대입 공격)
: 가능한 모든 키를 하나씩 대입해 암호문을 해독하려는 방식이다.
Known Plaintext Attack (알려진 평문 공격)
: 공격자는 일부 평문과 그에 대응하는 암호문을 알고 있다.
이를 바탕으로 암호문을 해독하려고 시도한다.
Chosen Plaintext Attack (선택된 평문 공격)
공격자는 자신이 선택한 평문을 암호화하여 그 결과인 암호문을 얻는다.
이를 바탕으로 암호문을 해독하려고 시도한다.
Chosen Ciphertext Attack (선택된 암호문 공격)
공격자는 자신이 선택한 암호문을 복호화한 평문을 얻어내는 방식이다. 이를 통해 복호화 과정의 약점을 이용하여 전체 키를 추정할 수 있다.
Chosen Text Attack (선택된 텍스트 공격)
공격자는 평문과 암호문을 모두 선택할 수 있으며, 이 데이터를 통해 암호화 시스템의 약점을 분석한다.
모두 암호 알고리즘과 해독해야 할 암호문은 이미 가지고 있다.
Encryption과 Decryption 방식이 동일한 암호화 구조.
⚠️ Feistel 구조(Feistel network)는 블록 암호(block cipher) 설계에 자주 사용되는 구조일 뿐, 자체적으로 블록 암호는 아니다.
암호화: K1부터 시작
복호화: K16부터 시작
특징을 알고 있어야 함.
DES는 1977년에 표준으로 채택된 대칭 키 암호화 알고리즘으로, Feistel 구조를 변형한 방식이다.
DES는 원래 64비트의 키를 사용하지만, 실제로는 56비트만이 유효하며, 나머지 8비트는 패리티 비트로 사용된다. 16개의 48비트 서브키는 원래 키에서 생성되며, 암호화 과정에서는 순차적으로, 복호화 과정에서는 역순으로 적용된다.
3DES는 DES의 단점을 보완하기 위해 DES 알고리즘을 세 번 적용하는 방식으로 설계되었다. 세 개의 서로 다른 키를 사용해 암호화와 복호화를 진행한다.
Cipher = E(K3, D(K2, E(K1, Plain)))
Plain = D(K1, E(K2, D(K3, Cipher)))
3DES는 DES보다 훨씬 더 강력한 보안을 제공하지만, 여전히 속도 문제와 블록 크기(64비트)로 인한 제약이 있다.
AES는 DES와 3DES의 한계를 극복하기 위해 2001년에 제정된 대칭 키 블록 암호화 표준이다.
AES는 DES와 달리 Feistel 구조가 아니며, 암호화와 복호화가 서로 다른 알고리즘을 사용한다.
복호화 과정은 암호화 과정과 반대 순서로 진행된다. 각 단계는 암호화에서 사용된 연산의 역연산을 수행한다.
AES는 3DES에 비해 보안성이 높고 연산 속도가 빠르기 때문에, 현재 널리 사용되고 있는 표준 암호화 알고리즘이다.
순서 외우지 마셈
랜덤 넘버는 다음과 같은 경우에 사용된다:
무작위성 (Randomness)
예측 불가능성 (Unpredictability)
독립성 vs 예측불가능성
- 독립성: 수열 [1,2,3,4,5,6]에서 4번째 값이 무엇인지 다른 수열로부터 예측할 수 없다.
- 예측불가능성: 수열 [1,2,3,4,5,6]에서 3번째 값으로부터 4번째 값을 예측할 수 없다.
따라서, 독립성이 존재하면 예측불가능성은 자연스럽게 따라온다.
TRNG (True Random Number Generator)
: 실제 랜덤 값을 input으로 사용하여 진성 랜덤넘버를 생성.
PRNG (Pseudorandom Number Generator)
: seed를 input으로 사용하며, 고정 길이의 의사 랜덤 비트열을 생성한다.
대칭키 암호화에서 주로 사용된다.
PRF (Pseudorandom Function)
: seed 값을 input으로 사용하여 의사 랜덤넘버를 생성.
Nonce나 대칭 암호키 생성에 사용된다.
PRNG와 PRF는 모두 deterministic하다.
PRNG에 사용되는 대표적인 암호 알고리즘:
스트림 암호화는 평문과 키 스트림을 XOR 연산하여 암호문을 생성하는 방식이다.
Cipher = Text XOR Key Stream
Text = Cipher XOR Key Stream
스트림 암호:
블록 암호:
for i = 0 to 255 do
S[i] = i;
T[i] = K[i mod (K의 바이트 수)];
// T는 256 bytes고, K는 256보다 작을 수 있다.
// Key Length만큼 K가 반복적으로 들어간다
j = 0
for i = 0 to 255 do
j = (j + S[i] + T[i]) mod 256;
SWAP(S[i], S[j]);
i,j = 0
while(true)
i = (i + 1) mod 256;
j = (j + S[i]) mod 256;
SWAP(S[i], S[j]);
t = (S[i] + S[j]) mod 256;
k = S[t];
// k
Deterministic하다.
결국에는 송신과 수신이 동일한 키를 가지게 된다.
블록 사이퍼 운용 모드
if, Pi = Pj => Ci should not = Cj
C = E(C_(i-1) ⊕ P_i)
IV: Initial Vector
복호화
D(C) = D(E(C_(i-1) ⊕ P_i))
= C_(i-1) ⊕ P_i
C_(i-1) ⊕ D(C) = C_(i-1) ⊕ C_(i-1) ⊕ P_i
= P_i
따라서, C_(i-1) ⊕ D[C_(i)] = P_(i)
IV 보호
공격자가 IV의 특정 비트 값을 바꿀 수 있다면, 해당 bit position이 뒤집힌 값이 나온다.
CBC의 문제점
속도 문제
오류 확산
P = C ⊕ S_s(E(IV))
S_s: shift register S의 left most s bits
어떤 블록 암호도 스트림 암호로 변경할 수 있다.
스트림 암호의 장점: 메시지를 블록 정수배로 안만들어도 됨, 실시간 사용 가능, 암호문 길이 = 평문 길이
암호 알고리즘 입력: 64bit shift register S(초기값 = IV), 키(K)
복호화
P = C ⊕ S_s(E(IV))
카운터
암호화
복호화
CTR의 장점
- 병렬처리 가능
- 랜덤 접근(블록 한개만도 복호화 가능)
- 보안성이 좋음
- 단순성
!!
ATM 네트워크
IPSec에서 사용
!!