블록 암호 운용 모드(block cipher mode of operation)는 블록 암호를 기본 요소로 삼아 기밀성이나 인증 같은 암호 서비스를 주는 알고리즘이다.[1] 운용 모드는 평문을 블록의 열로 나눠 처리하며, CFB(Cipher Feedback) 모드만 블록보다 작을 수 있는 조각의 열로 나눈다.[2]
NIST SP 800-38A는 기밀성을 위한 모드로 ECB(Electronic Codebook), CBC(Cipher Block Chaining), CFB, OFB(Output Feedback), CTR(Counter) 다섯을 정하고, 다섯 모드를 AES처럼 NIST가 승인한 대칭 키 블록 암호와 함께 쓰게 한다.[2] 기밀성과 인증을 함께 주는 모드는 SP 800-38C와 SP 800-38D가 따로 정한다.[1]
기호
이 페이지는 SP 800-38A의 기호를 쓴다. 키 로 블록 암호를 적용하는 순방향 함수를 , 그 역함수를 로 쓴다. 평문 블록은 , 암호문 블록은 , 블록의 비트 수는 , 배타적 논리합은 다.[2]
ECB
ECB 모드는 평문 블록마다 순방향 함수를 따로 적용한다. 암호화는 , 복호화는 다. 같은 키를 쓰면 같은 평문 블록은 언제나 같은 암호문 블록이 되므로, 평문에서 되풀이되는 블록은 암호문에서도 같은 블록으로 되풀이된다. 블록끼리 서로 기대지 않아 암호화와 복호화를 모두 병렬로 할 수 있다.[2]
CBC
CBC 모드는 평문 블록을 바로 앞 암호문 블록과 배타적 논리합한 뒤 순방향 함수에 넣는다. 첫 블록은 앞 암호문 대신 IV(Initialization Vector)와 배타적 논리합한다.[2]
- 암호화: ,
- 복호화: , [2]
이 문서는 CBC의 IV를 예측할 수 없게 고르도록 정한다. 암호화는 앞 블록의 결과를 기다려야 하므로 병렬로 할 수 없지만, 복호화는 암호문 블록이 모두 있으므로 병렬로 할 수 있다.[2]
CFB
CFB 모드는 앞 암호문 조각을 입력 블록에 되먹이고, 입력 블록에 순방향 함수를 적용한 출력 블록을 평문과 배타적 논리합한다. 조각의 비트 수 는 인 정수다. 첫 입력 블록 은 IV이고, 그 뒤의 입력 블록은 앞 입력 블록의 오른쪽 비트 뒤에 앞 암호문 조각을 이어 붙인 것이다. 출력 블록 의 왼쪽 비트를 평문 조각과 배타적 논리합하면 암호문 조각이 된다. 복호화도 역함수가 아니라 순방향 함수를 쓴다.[2]
이 문서는 CFB의 IV도 예측할 수 없게 고르도록 정한다. 암호화는 병렬로 할 수 없다. 복호화는 IV와 암호문으로 입력 블록을 먼저 만들어 두면 병렬로 할 수 있다.[2]
OFB
OFB 모드는 순방향 함수의 출력을 다음 입력으로 되먹여 출력 블록의 열을 만든다. 첫 입력 블록은 IV이고, 출력 블록 에 대해 다. 마지막 블록이 짧으면 마지막 출력 블록의 왼쪽에서 그 길이만큼만 쓴다. IV만 알면 평문이나 암호문이 오기 전에 출력 블록을 먼저 만들어 놓을 수 있다.[2]
이 문서는 OFB의 IV를 한 키 아래에서 모드를 실행할 때마다 유일한 nonce로 두도록 정한다. 같은 IV로 두 메시지를 암호화하면 기밀성이 깨질 수 있다. 한 메시지의 번째 평문 블록을 아는 공격자가 다른 메시지의 번째 평문 블록을 되찾을 수 있기 때문이다.[2]
CTR
CTR 모드는 카운터 블록의 열에 순방향 함수를 적용해 출력 블록을 만들고, 이를 평문과 배타적 논리합한다. 카운터 블록 에 대해 , 이고, 복호화는 같은 출력 블록을 암호문과 배타적 논리합한다.[2]
이 문서는 한 키로 암호화하는 모든 메시지에 걸쳐 카운터 블록이 서로 다르게 정한다. 카운터 블록을 만드는 방법의 예로는 블록의 앞쪽 비트를 메시지마다 다른 nonce로 두고, 나머지 비트를 블록마다 1씩 늘리는 방법을 든다. 암호화와 복호화를 모두 병렬로 할 수 있고, 데이터가 오기 전에 카운터 블록에 순방향 함수를 적용해 둘 수 있다.[2]
오류 전파
암호문의 비트 하나가 바뀌었을 때 복호한 평문이 받는 영향은 모드마다 다르다.[2]
| 모드 | 바뀐 비트가 든 블록이나 조각의 평문 | 그 뒤의 평문 |
|---|---|---|
| ECB | 블록 전체가 망가진다. | 영향 없음 |
| CBC | 블록 전체가 망가진다. | 다음 블록의 같은 자리 비트만 뒤집히고, 그 뒤는 영향이 없다. |
| CFB | 같은 자리 비트가 뒤집힌다. | 뒤따르는 개 조각이 망가진다. |
| OFB, CTR | 같은 자리 비트가 뒤집힌다. | 영향 없음 |
CBC에서 IV의 비트가 바뀌면 첫 평문 블록의 같은 자리 비트가 뒤집히고, 다른 블록은 영향을 받지 않는다. IV는 비밀일 필요가 없지만, 이 문서는 CBC의 IV를 변조에서 보호하기를 권한다. 무결성을 따로 보호하지 않으면 공격자가 OFB나 CTR의 암호문 블록, 또는 CBC의 IV에 비트 오류를 넣어 복호 결과의 특정 비트를 바꿀 수 있다.[2]
패딩과 ciphertext stealing
ECB와 CBC는 평문 길이가 블록의 정수배여야 하고, CFB는 조각 크기 의 정수배여야 한다. 길이가 맞지 않으면 평문에 패딩을 붙인다. 이 문서는 그 방법의 예로 평문 끝에 비트 1을 하나 붙이고, 블록이 찰 때까지 0을 붙이는 방법을 든다. OFB와 CTR은 마지막 블록에서 출력 블록의 일부만 쓰므로 평문이 블록의 정수배가 아니어도 된다.[2]
Ciphertext stealing은 필요한 패딩 비트를 끝에서 두 번째 암호문 블록에서 가져오는 패딩 방법이다. 길이가 블록 크기 이상인 평문이면 블록의 정수배가 아니어도 CBC로 암호화할 수 있고, 암호문은 평문과 길이가 같다. SP 800-38A의 Addendum은 이 방법의 세 변형 CBC-CS1, CBC-CS2, CBC-CS3을 정한다. 셋은 암호문 비트의 순서만 다르며, CBC-CS2와 CBC-CS3은 마지막 두 블록의 순서를 바꿔 내보낸다.[3]
인증 암호 모드
AEAD(Authenticated Encryption with Associated Data)는 평문의 기밀성과 무결성·진위 확인에, 함께 넘기는 연관 데이터의 무결성·진위 확인을 더한 암호 방식이다. 연관 데이터는 암호화하지 않지만 인증 대상에 든다.[4]
CCM(Counter with CBC-MAC)은 CTR 모드로 기밀성을 주고 CBC-MAC으로 인증한다. NIST SP 800-38C가 CCM을 정하며, 블록 크기가 128비트인 블록 암호를 쓰도록 한다.[5]
GCM(Galois/Counter Mode)은 CTR 모드의 변형으로 암호화하고, 이진 갈루아체 위에서 해시 서브키와의 곱셈으로 정의한 해시 함수 GHASH로 인증한다. GHASH가 연관 데이터와 암호문을 한 블록으로 줄이고, 그 블록을 암호화해 인증 태그를 만든다. NIST SP 800-38D가 GCM을 정하며, 한 키 아래에서 IV가 되풀이되지 않게 한다. IV가 한 번이라도 되풀이되면 위조 공격에 취약해질 수 있다.[6]