Replicated

블록 암호와 패딩, 운영 모드 본문

소프트웨어 보안개발방법론

블록 암호와 패딩, 운영 모드

라구넹 2025. 4. 19. 16:59

블록 암호

- 평문과 암호문이 고정된 크기의 블록으로 구성

- 평문을 일정 크기의 블록으로 나눈 후 블록 단위 암호문 구성

- 블록 크기를 맞추기 위한 패딩 필요 (모두 필요한 건 아니고)

- 혼돈(Confusion) & 확산(Diffusion)

- P-Box(Permutation Box), S-Box(Substitution Box), XOR, Shift, Swap..

- 다양한 키 길이에 따라 여러 라운드를 반복 실행, 혼돈과 확산을 높임

 

 

블록 암호 패딩

- 입력 데이터가 블록 크기 배수가 아닐 때, 배수가 되도록 채움

- 복호화 시 원본 메시지의 끝, 패딩의 시작 구분 가능해야 함

- 메시지 복호화가 정상적으로 실행되었는지 검증 기능 제공

- 메시지가 블록 크기의 배수이면? => 패딩 블록 추가 (블록 하나 통으로 패딩)

 

패딩 종류

PKCS#7 패딩

- 가장 많이 사용

- 부족한 바이트 수만큼 해당 바이트 값 채움 ( ~~~ || 0x04 || 0x04 || 0x04 || 0x04 )

Zero 패딩

- 부족한 바이트를 0x00으로 채움.. 근데 마지막 데이터의 바이트가 0x00이면 어떻게 알지? -> TLV 포맷 사용

- TLV 포맷.. Tag: 뭐가 있다 Length: 몇 바이트이다 Value: 값

ANSI X.923 패딩

- 마지막 바이트에 패딩 길이를 표시, 0x00으로 채움 ( ~~~ || 0x00 || 0x00 || 0x00 || 0x04 )

ISO 10126 패딩

- 마지막 바이트에 패딩 길이를 표시, 나머지는 랜덤값으로 채움 ( ~~~ || 0x?? || 0x?? || 0x?? || 0x04 )

 

* TLV(Tag-Length-Value) 포맷

- 데이터 구조화 방식

- Tag: 데이터 유형 / Length: Value 길이 / Value: 데이터

- 유연성, 확장성

- 네트워크 프로토콜, X.509 인증서(ASN.1 인코딩) 등

 

 

블록 암호 운영 모드

- ECB, CBC, CTR, CFB, OFB, PCBC

- ECB, CBC, PCBC -> 그냥 블록

- CTR, CFB, OFB -> 스트림 암호와 유사하게 동작

 

ECB (Electronic Codebook)

- 각 블록을 동일한 키로 암호화

- 각 블록별 독립 처리, 한 블록의 오류는 다른 블록에 영향을 주지 않음

- 구현이 간단, 병렬처리 가능

- 동일한 평문 블록은 동일한 암호문 블록을 생성

 

CBC (Cipher Block Chaning)

- IV(Initial Vector) 또는 이전 암호문 블록과 XOR 후 암호화

- 한 블록의 오류 -> 다음 블록에 영향

- IV 따라 동일한 평문이 다른 암호문

- 암호화 시 병렬 처리가 불가능 (복호화는 가능)

 

PCBC (Propagating Cipher Block Chaining)

- CBC의 변형, 각 단계에서 이전 평문과 암호문을 입력으로 사용 (이전 평문-암호문 XOR 후 현 평문과 XOR)

- 한 블록의 오류 발생 시 이후 모든 블록에 영향(강력한 오류 전파)

- 병렬 처리 불가

- 무결성 검증 용이

- 구현의 복잡성 및 성능 제약으로 거의 사용되지 않음

 

CFB (Cipher FeedBack)

- 스트림 암호처럼 동작

- 이전 암호문 블록을 암호화, 다음 키 스트림 블록 생성 후 평문과 XOR 연산을 통해 새로운 암호문 생성

- 가변길이 데이터를 패딩 없이 암호화 가능, 비트 단위 가능 (시킬 순 있는데, 메시지 길이로 원본을 추측하지 못하게 하려는 의도로 시키는 것)

- 암호화 시 병렬처리 불가능 (복호화 시 가능)

 

OFB (Output FeedBack)
- 스트림 암호처럼 동작

- 이전 키 스트림 블록을 암호화하여 다음 키 스트림 생성 후 평문과 XOR 연산 수행

- 가변길이 데이터를 패딩 없이 암호화 가능, 비트 단위 가능 (시킬 순 있는데, 메시지 길이로 원본을 추측하지 못하게 하려는 의도로 시키는 것)

- 병렬 처리 불가

- CFB에 빠른 처리 속도

 

CTR (Counter)

- 스트림 암호처럼 동작

- Nonce, Counter값을 암호화하여 키 스트림 생성 후 평문과 XOR

- 가변길이 데이터를 패딩 없이 암호화 가능, 비트 단위 가능 (시킬 순 있는데, 메시지 길이로 원본을 추측하지 못하게 하려는 의도로 시키는 것)

- 병렬 처리 가능(높은 성능)

 

* Nonce는 세션 간 유지되는 값, Counter는 암호화마다 1씩 증가

 

ECB, CBC, PCBC

- 무조건 패딩

- 키와 플레인텍스트 -> 사이퍼텍스트

- 블록 사이퍼에 키와 플레인텍스트가 들어감

 

CFB, OFB, CTR

- 패딩을 안해도 됨. 근데 프로토콜마다 시키긴 하는데, 메시지 길이로 추측하지 못하게 하려는 것

- 키와 값이 들어감. 플레인 텍스트가 입력값이 되지 않음. 키 스트림을 만듦.