반응형
대칭키 암호화 패딩(Padding)과 모드(Mode) 이해하기
개요
안녕하세요! 이번 포스팅에서는 대칭키 암호화의 핵심 개념인 패딩(Padding)과 모드(Mode)에 대하여 상세히 알아보겠습니다.
암호화를 처음 접하시는 분들은 "왜 데이터를 특정 크기로 맞춰야 하는가?", "CBC, ECB는 무엇인가?" 같은 의문을 가지실 수 있습니다. 이 글에서는 PKCS#5, PKCS#7 패딩 방식과 다양한 암호화 모드를 쉽게 이해할 수 있도록 설명해드리겠습니다.
암호화를 처음 접하시는 분들은 "왜 데이터를 특정 크기로 맞춰야 하는가?", "CBC, ECB는 무엇인가?" 같은 의문을 가지실 수 있습니다. 이 글에서는 PKCS#5, PKCS#7 패딩 방식과 다양한 암호화 모드를 쉽게 이해할 수 있도록 설명해드리겠습니다.
목차
1. 패딩(Padding)이란?
2. PKCS#5와 PKCS#7 패딩 표준
3. 암호화 모드(Mode)와 IV
4. 주요 암호화 모드 비교
5. 자주 묻는 질문(FAQ)
#1. 패딩(Padding)이란?
패딩(Padding)은 데이터를 특정 크기로 맞추기 위해 부족한 부분을 채워넣는 작업을 가리키는 용어입니다. 암호화에서 패딩은 필수적인 과정으로, 블록 암호화 알고리즘이 요구하는 블록 크기에 맞추기 위해 사용됩니다.
1) 왜 패딩이 필요한가?
블록 암호화 알고리즘(DES, AES 등)은 정해진 크기의 블록 단위로 데이터를 암호화합니다. 하지만 실제 데이터는 이 블록 크기의 정확한 배수가 아닌 경우가 대부분입니다.
패딩의 필요성 예시
상황: DES 암호화 (8바이트 블록 크기)
원본 데이터: "HELLO" (5바이트)
필요 크기: 8바이트
부족한 크기: 3바이트
→ 3바이트를 채워서 8바이트로 만들어야 암호화 가능!
패딩 후: "HELLO" + 3바이트 패딩 = 8바이트
원본 데이터: "HELLO" (5바이트)
필요 크기: 8바이트
부족한 크기: 3바이트
→ 3바이트를 채워서 8바이트로 만들어야 암호화 가능!
패딩 후: "HELLO" + 3바이트 패딩 = 8바이트
. . . . .
2) 패딩의 기본 원리
패딩은 단순히 빈 공간을 채우는 것이 아니라, 복호화 시 원본 데이터를 정확히 복원할 수 있도록 규칙에 따라 수행되어야 합니다.
패딩의 기본 규칙
① 패딩할 바이트 수를 값으로 사용
② 모든 패딩 바이트는 동일한 값
③ 복호화 시 마지막 바이트 값만큼 제거
예시:
3바이트 패딩이 필요하면 → 0x03 0x03 0x03 추가
5바이트 패딩이 필요하면 → 0x05 0x05 0x05 0x05 0x05 추가
② 모든 패딩 바이트는 동일한 값
③ 복호화 시 마지막 바이트 값만큼 제거
예시:
3바이트 패딩이 필요하면 → 0x03 0x03 0x03 추가
5바이트 패딩이 필요하면 → 0x05 0x05 0x05 0x05 0x05 추가
#2. PKCS#5와 PKCS#7 패딩 표준
1) PKCS#5 패딩 표준
PKCS#5는 Password 기반 암호화 표준(Password-based Encryption Standard)으로, 현대 공인인증 방식의 근간이 되는 표준입니다.
(1) PKCS#5의 특징
① 8바이트 블록 크기 기준
② Password로 표현 가능한 키 사용
③ DES, TripleDES 등에 적용
④ ASCII 코드 0~255 (1바이트 = 1 octet) 기반
② Password로 표현 가능한 키 사용
③ DES, TripleDES 등에 적용
④ ASCII 코드 0~255 (1바이트 = 1 octet) 기반
(2) PKCS#5 패딩 예시
PKCS#5 패딩 실전 예시
예시 1: 5바이트 데이터
원본: "HELLO" (5바이트)
부족: 8 - 5 = 3바이트
패딩 후: "HELLO" + 0x03 0x03 0x03 = 8바이트
예시 2: 7바이트 데이터
원본: "MESSAGE" (7바이트)
부족: 8 - 7 = 1바이트
패딩 후: "MESSAGE" + 0x01 = 8바이트
예시 3: 8바이트 데이터 (중요!)
원본: "TESTDATA" (8바이트)
부족: 0바이트이지만 8바이트 패딩 추가!
패딩 후: "TESTDATA" + 0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08 = 16바이트
원본: "HELLO" (5바이트)
부족: 8 - 5 = 3바이트
패딩 후: "HELLO" + 0x03 0x03 0x03 = 8바이트
예시 2: 7바이트 데이터
원본: "MESSAGE" (7바이트)
부족: 8 - 7 = 1바이트
패딩 후: "MESSAGE" + 0x01 = 8바이트
예시 3: 8바이트 데이터 (중요!)
원본: "TESTDATA" (8바이트)
부족: 0바이트이지만 8바이트 패딩 추가!
패딩 후: "TESTDATA" + 0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08 = 16바이트
⚠️ 중요!
데이터가 이미 블록 크기의 배수인 경우에도 반드시 패딩을 추가해야 합니다. 이는 복호화 시 원본 데이터와 패딩을 정확히 구분하기 위함입니다.
패딩을 생략하면 복호화 시 데이터 손실이 발생할 수 있습니다!
데이터가 이미 블록 크기의 배수인 경우에도 반드시 패딩을 추가해야 합니다. 이는 복호화 시 원본 데이터와 패딩을 정확히 구분하기 위함입니다.
패딩을 생략하면 복호화 시 데이터 손실이 발생할 수 있습니다!
. . . . .
2) PKCS#7 패딩 표준
PKCS#7은 PKCS#5의 확장 버전으로, 128비트(16바이트) 이상의 블록 암호화 알고리즘에 대응하기 위해 개발되었습니다.
(1) PKCS#7의 특징
① 1~255바이트 블록 크기 지원
② AES 등 현대 암호화 알고리즘에 적용
③ PKCS#5와 동일한 패딩 방식 사용
④ 블록 크기가 k바이트인 경우 최대 k바이트 패딩
② AES 등 현대 암호화 알고리즘에 적용
③ PKCS#5와 동일한 패딩 방식 사용
④ 블록 크기가 k바이트인 경우 최대 k바이트 패딩
(2) PKCS#7 패딩 예시 (AES 기준)
PKCS#7 패딩 실전 예시 (AES 16바이트)
예시 1: 10바이트 데이터
원본: "HELLOWORLD" (10바이트)
부족: 16 - 10 = 6바이트
패딩 후: "HELLOWORLD" + 0x06 0x06 0x06 0x06 0x06 0x06 = 16바이트
예시 2: 15바이트 데이터
원본: "ENCRYPTION_TEST" (15바이트)
부족: 16 - 15 = 1바이트
패딩 후: "ENCRYPTION_TEST" + 0x01 = 16바이트
예시 3: 16바이트 데이터
원본: "SIXTEENBYTES1234" (16바이트)
부족: 0바이트이지만 16바이트 패딩 추가!
패딩 후: "SIXTEENBYTES1234" + 16개의 0x10 = 32바이트
원본: "HELLOWORLD" (10바이트)
부족: 16 - 10 = 6바이트
패딩 후: "HELLOWORLD" + 0x06 0x06 0x06 0x06 0x06 0x06 = 16바이트
예시 2: 15바이트 데이터
원본: "ENCRYPTION_TEST" (15바이트)
부족: 16 - 15 = 1바이트
패딩 후: "ENCRYPTION_TEST" + 0x01 = 16바이트
예시 3: 16바이트 데이터
원본: "SIXTEENBYTES1234" (16바이트)
부족: 0바이트이지만 16바이트 패딩 추가!
패딩 후: "SIXTEENBYTES1234" + 16개의 0x10 = 32바이트
. . . . .
3) PKCS#5 vs PKCS#7 비교
| 구분 | PKCS#5 | PKCS#7 |
|---|---|---|
| 블록 크기 | 8바이트 고정 | 1~255바이트 가변 |
| 적용 알고리즘 | DES, TripleDES | AES, 현대 암호화 알고리즘 |
| 패딩 방식 | 부족한 바이트 수만큼 채움 | 부족한 바이트 수만큼 채움 (동일) |
| 최대 패딩 | 8바이트 | 블록 크기에 따라 다름 |
| 현재 사용 | 레거시 시스템 | 현대 시스템 (주로 사용) |
#3. 암호화 모드(Mode)와 IV
모드(Mode)는 블록 암호화의 순서 및 규칙에 대한 표준입니다. 같은 암호화 알고리즘이라도 모드에 따라 보안성과 성능이 크게 달라집니다.
1) 초기화 벡터(IV; Initialization Vector)란?
IV는 암호화의 시작점을 무작위로 만들어 보안성을 높이는 값입니다. 같은 평문이라도 IV가 다르면 다른 암호문이 생성됩니다.
IV의 역할
IV가 없는 경우:
평문 "HELLO" + 키 "SECRET" → 항상 같은 암호문
문제: 패턴 분석 가능, 보안 취약
IV가 있는 경우:
평문 "HELLO" + 키 "SECRET" + IV1 → 암호문1
평문 "HELLO" + 키 "SECRET" + IV2 → 암호문2 (다름!)
장점: 매번 다른 암호문 생성, 패턴 분석 불가
평문 "HELLO" + 키 "SECRET" → 항상 같은 암호문
문제: 패턴 분석 가능, 보안 취약
IV가 있는 경우:
평문 "HELLO" + 키 "SECRET" + IV1 → 암호문1
평문 "HELLO" + 키 "SECRET" + IV2 → 암호문2 (다름!)
장점: 매번 다른 암호문 생성, 패턴 분석 불가
(1) IV의 특성
① 블록 크기와 동일한 길이 (예: AES는 16바이트)
② 매번 무작위로 생성
③ 비밀로 유지할 필요 없음 (암호문과 함께 전송 가능)
④ 재사용 금지 (같은 키로 같은 IV 사용 시 보안 취약)
② 매번 무작위로 생성
③ 비밀로 유지할 필요 없음 (암호문과 함께 전송 가능)
④ 재사용 금지 (같은 키로 같은 IV 사용 시 보안 취약)
. . . . .
2) ECB 모드 (Electronic Codebook)
ECB는 가장 단순한 암호화 모드로, 각 블록을 독립적으로 암호화합니다.
(1) ECB 모드의 특징
① 각 블록을 독립적으로 암호화
② IV 사용 안 함
③ 병렬 처리 가능 (빠름)
④ 보안성 낮음 - 실무에서 권장하지 않음
② IV 사용 안 함
③ 병렬 처리 가능 (빠름)
④ 보안성 낮음 - 실무에서 권장하지 않음
❌ ECB 모드의 문제점
같은 평문 블록 → 같은 암호문 블록
평문: "HELLO" "HELLO" "WORLD"
암호문: [A] [A] [B]
→ 첫 번째와 두 번째 블록이 같다는 것을 알 수 있음!
→ 패턴이 노출되어 보안에 취약
특히 이미지 암호화 시 원본 이미지의 윤곽이 그대로 드러나는 문제 발생
평문: "HELLO" "HELLO" "WORLD"
암호문: [A] [A] [B]
→ 첫 번째와 두 번째 블록이 같다는 것을 알 수 있음!
→ 패턴이 노출되어 보안에 취약
특히 이미지 암호화 시 원본 이미지의 윤곽이 그대로 드러나는 문제 발생
. . . . .
3) CBC 모드 (Cipher-Block Chaining)
CBC는 가장 많이 사용되는 암호화 모드로, 이전 블록의 암호문을 다음 블록 암호화에 활용합니다.
(1) CBC 모드의 동작 원리
① 첫 번째 블록: 평문 ⊕ IV → 암호화
② 두 번째 블록: 평문 ⊕ (첫 번째 암호문) → 암호화
③ 세 번째 블록: 평문 ⊕ (두 번째 암호문) → 암호화
④ 마지막까지 반복
(⊕ 는 XOR 연산을 의미)
② 두 번째 블록: 평문 ⊕ (첫 번째 암호문) → 암호화
③ 세 번째 블록: 평문 ⊕ (두 번째 암호문) → 암호화
④ 마지막까지 반복
(⊕ 는 XOR 연산을 의미)
✅ CBC 모드의 장점
같은 평문 블록이라도 다른 암호문 생성
평문: "HELLO" "HELLO" "WORLD"
암호문: [A] [B] [C] (모두 다름!)
→ 이전 블록의 영향으로 매번 다른 암호문 생성
→ 패턴 분석 불가능, 보안성 높음
ECB 모드보다 훨씬 안전하여 실무에서 가장 많이 사용
평문: "HELLO" "HELLO" "WORLD"
암호문: [A] [B] [C] (모두 다름!)
→ 이전 블록의 영향으로 매번 다른 암호문 생성
→ 패턴 분석 불가능, 보안성 높음
ECB 모드보다 훨씬 안전하여 실무에서 가장 많이 사용
(2) CBC 모드의 특징
① IV 필수 사용
② 순차 처리 필요 (병렬 처리 불가)
③ 높은 보안성
④ 실무에서 가장 권장되는 모드
② 순차 처리 필요 (병렬 처리 불가)
③ 높은 보안성
④ 실무에서 가장 권장되는 모드
#4. 주요 암호화 모드 비교
다양한 암호화 모드의 특징과 장단점을 비교해보겠습니다.
1) 주요 모드별 특성 비교
| 모드 | IV 사용 | 병렬 처리 | 보안성 | 권장 여부 |
|---|---|---|---|---|
| ECB | ❌ 없음 | ✅ 가능 | 낮음 | ❌ 비권장 |
| CBC | ✅ 필수 | ❌ 불가능 | 높음 | ✅ 권장 |
| CTR | ✅ 필수 | ✅ 가능 | 높음 | ✅ 권장 |
| GCM | ✅ 필수 | ✅ 가능 | 매우 높음 | ✅ 최신 권장 |
. . . . .
2) 기타 암호화 모드 소개
(1) CTR 모드 (Counter Mode)
① 카운터 값을 암호화하여 평문과 XOR 연산
② 병렬 처리 가능 (빠름)
③ 스트림 암호처럼 동작
④ 임의 접근 가능
② 병렬 처리 가능 (빠름)
③ 스트림 암호처럼 동작
④ 임의 접근 가능
(2) GCM 모드 (Galois/Counter Mode)
① CTR 모드 + 인증 기능
② 데이터 무결성 검증 가능
③ 높은 성능과 보안성
④ 현대 암호화에서 가장 권장되는 모드
② 데이터 무결성 검증 가능
③ 높은 성능과 보안성
④ 현대 암호화에서 가장 권장되는 모드
(3) CFB 모드 (Cipher Feedback)
① 스트림 암호처럼 동작
② 블록 크기보다 작은 데이터 처리 가능
③ 오류 전파 특성
② 블록 크기보다 작은 데이터 처리 가능
③ 오류 전파 특성
(4) OFB 모드 (Output Feedback)
① 스트림 암호 생성
② 오류 전파 없음
③ 동기화 필요
② 오류 전파 없음
③ 동기화 필요
#5. 자주 묻는 질문(FAQ)
1) Q: 데이터가 블록 크기의 정확한 배수인데도 패딩을 해야 하나요?
A: 네, 반드시 해야 합니다! 이는 복호화 시 원본 데이터와 패딩을 구분하기 위한 필수 과정입니다. 예를 들어 8바이트 데이터에 패딩을 하지 않으면, 복호화 시 마지막 바이트를 패딩으로 오인하여 데이터 손실이 발생할 수 있습니다.
. . . . .
2) Q: PKCS#5와 PKCS#7의 실질적인 차이는 무엇인가요?
A: 패딩 방식 자체는 동일하며, 차이는 지원하는 블록 크기입니다. PKCS#5는 8바이트 블록에만 적용되고, PKCS#7은 1~255바이트 블록을 모두 지원합니다. 실무에서는 AES(16바이트 블록)를 많이 사용하므로 PKCS#7을 더 많이 사용합니다.
. . . . .
3) Q: ECB 모드는 왜 사용하면 안 되나요?
A: ECB 모드는 같은 평문 블록이 항상 같은 암호문을 생성하여 패턴 분석에 취약합니다. 특히 이미지를 ECB로 암호화하면 원본의 윤곽이 그대로 드러나는 심각한 보안 문제가 발생합니다. 실무에서는 CBC 이상의 모드를 사용해야 합니다.
. . . . .
4) Q: IV는 비밀로 유지해야 하나요?
A: 아니요, IV는 비밀이 아닙니다. IV는 암호문과 함께 공개적으로 전송할 수 있습니다. 중요한 것은 같은 키로 같은 IV를 재사용하지 않는 것입니다. 매번 무작위로 새로운 IV를 생성하면 보안성이 유지됩니다.
. . . . .
5) Q: CBC 모드를 사용할 때 주의할 점은?
A: CBC 모드 사용 시 주의사항:
① IV는 매번 무작위로 생성해야 합니다.
② IV를 재사용하면 보안 취약점 발생
③ 패딩 오류 공격(Padding Oracle Attack)에 주의
④ 암호문과 함께 IV를 전송해야 복호화 가능
⑤ 병렬 처리가 불가능하여 속도가 상대적으로 느림
① IV는 매번 무작위로 생성해야 합니다.
② IV를 재사용하면 보안 취약점 발생
③ 패딩 오류 공격(Padding Oracle Attack)에 주의
④ 암호문과 함께 IV를 전송해야 복호화 가능
⑤ 병렬 처리가 불가능하여 속도가 상대적으로 느림
. . . . .
6) Q: 어떤 암호화 모드를 사용하는 것이 가장 좋나요?
A: 현대 암호화에서는 GCM 모드를 가장 권장합니다. GCM은 높은 보안성과 성능을 모두 제공하며, 데이터 무결성 검증까지 가능합니다. GCM을 사용할 수 없다면 CBC 모드가 차선책입니다. ECB 모드는 절대 사용하지 마세요.
. . . . .
7) Q: 패딩과 암호화 모드는 어떤 관계인가요?
A: 패딩과 모드는 별개의 개념입니다. 패딩은 데이터를 블록 크기에 맞추는 과정이고, 모드는 블록들을 어떻게 암호화할지 결정하는 방식입니다. 대부분의 블록 암호화 모드(ECB, CBC 등)는 패딩이 필요하지만, 스트림 암호처럼 동작하는 CTR, GCM 모드는 패딩이 불필요할 수 있습니다.
마무리
이번 글에서는 대칭키 암호화의 핵심 개념인 패딩(Padding)과 모드(Mode)에 대해 상세히 알아보았습니다.
핵심 요약:
① 패딩은 필수 - 데이터가 블록 크기의 배수여도 반드시 패딩 추가
② PKCS#7이 현대 표준 - AES 등 현대 암호화 알고리즘에 사용
③ ECB 모드는 절대 사용 금지 - 보안에 매우 취약
④ CBC 모드가 기본 - 실무에서 가장 많이 사용
⑤ GCM 모드가 최신 권장 - 보안성과 성능 모두 우수
⑥ IV는 매번 무작위 생성 - 재사용 금지
암호화는 단순히 알고리즘만 선택하는 것이 아니라, 적절한 패딩과 모드를 함께 고려해야 안전한 시스템을 구축할 수 있습니다. 특히 실무에서는 검증된 라이브러리를 사용하고, 보안 가이드라인을 준수하는 것이 중요합니다.
핵심 요약:
① 패딩은 필수 - 데이터가 블록 크기의 배수여도 반드시 패딩 추가
② PKCS#7이 현대 표준 - AES 등 현대 암호화 알고리즘에 사용
③ ECB 모드는 절대 사용 금지 - 보안에 매우 취약
④ CBC 모드가 기본 - 실무에서 가장 많이 사용
⑤ GCM 모드가 최신 권장 - 보안성과 성능 모두 우수
⑥ IV는 매번 무작위 생성 - 재사용 금지
암호화는 단순히 알고리즘만 선택하는 것이 아니라, 적절한 패딩과 모드를 함께 고려해야 안전한 시스템을 구축할 수 있습니다. 특히 실무에서는 검증된 라이브러리를 사용하고, 보안 가이드라인을 준수하는 것이 중요합니다.
긴 글 읽어주셔서 감사합니다.
끝.
끝.
반응형
'Development > Security' 카테고리의 다른 글
| [Security] 공개키 인증서 완벽 가이드 : 일반인도 쉽게 이해할 수 있는 디지털 신분증 개념부터 활용까지 한 방에 이해하기 (0) | 2019.09.04 |
|---|---|
| [Security] X.509 인증서에 대하여 (0) | 2019.09.02 |
| [Security] Android KeyChain을 사용하여 대칭 키를 안전하게 저장 (0) | 2019.08.29 |
| [Security] 대칭키 암호화 (0) | 2019.08.29 |
| [Security] PKCS 정의 (0) | 2019.08.29 |