블록 암호 운영 모드
기본 블록 암호는 고정된 크기의 단일 블록(AES·SEED·ARIA·Camellia·SM4는 16바이트, DES·TDES는 8바이트)만 치환한다. 임의 길이의 메시지를 안전하게 암호화하기 위해 운영 모드(Mode of Operation)는 블록들을 어떻게 연쇄(Chaining)하거나 키스트림으로 변환하거나 인증 태그와 결합할지 정의한다. NodeCrypto의 대칭키 암호 노드는 Cipher Mode 파라미터를 제공하며, 선택된 모드에 필요한 입출력 포트만 동적으로 노출한다.
| 모드 | 분류 | 표준 | 추가 포트 |
|---|---|---|---|
| ECB | 독립 블록 | NIST SP 800-38A §6.1 | — |
| CBC | 블록 연쇄 | NIST SP 800-38A §6.2 | IV |
| GCM | AEAD | NIST SP 800-38D | Nonce, AAD(선택), 인증 태그 |
| CCM | AEAD | NIST SP 800-38C | Nonce, AAD(선택), 인증 태그 |
| CTR | 스트림 (카운터) | NIST SP 800-38A §6.5 | IV |
| CFB | 스트림 (피드백) | NIST SP 800-38A §6.3 | IV |
| OFB | 스트림 (피드백) | NIST SP 800-38A §6.4 | IV |
| XTS | 디스크·섹터 암호화 | IEEE 1619-2007 / NIST SP 800-38E | IV (Tweak) |
| KW | 키 래핑 | NIST SP 800-38F / RFC 3394 | — |
결정적 기본 IV / Nonce 동작: 선택 입력인 IV 또는 Nonce 포트를 연결하지 않고 비워 두면 NodeCrypto는 임의의 난수를 생성하지 않고, 요구되는 길이만큼 0x00으로 채워진 바이트 배열(128비트 블록 암호의 CBC·CTR·CFB·OFB·XTS는 16바이트, DES·TDES는 8바이트, GCM·CCM은 12바이트)을 결정적으로 공급한다. 이는 테스트 벡터 검증과 프로토콜 디버깅에서 항상 재현 가능한 실행 결과를 보장하기 위함이며, 실제 운영 프로토콜에서는 반드시 고유한 Nonce 또는 예측 불가능한 IV를 직접 공급해야 한다.
ECB (Electronic Codebook)
동일한 키로 각 평문 블록을 독립적으로 암호화한다. 블록 사이에 전달되는 연쇄 상태, 초기화 벡터(IV), 카운터가 없다. 입력 길이가 블록 크기의 배수이거나 None이 아닌 패딩 모드가 설정되어야 한다.
CBC (Cipher Block Chaining)
블록 암호화 함수를 적용하기 전에 각 평문 블록을 직전 암호문 블록(첫 번째 블록은 초기화 벡터 IV)과 XOR한다. 각 블록이 이전 모든 블록에 의존하므로 동일한 평문 블록이라도 서로 다른 암호문 블록으로 암호화된다. 블록 정렬 또는 PKCS7 같은 가역 패딩 방식이 필요하다.
IV를 사용해야 하며, CBC 단독으로는 암호문 위변조(패딩 오라클 공격 등)를 막을 수 없다. AEAD 모드(GCM)를 사용하거나 CBC 뒤에 Encrypt-then-MAC(HMAC) 구성을 결합하는 것이 안전하다.GCM (Galois/Counter Mode)
카운터(CTR) 모드 암호화와 GF(2128) 유한체 위의 범용 해시 함수(GHASH)를 결합한 연관 데이터 포함 인증 암호화(AEAD) 모드이다. 단일 연산으로 기밀성과 무결성을 동시에 제공한다. 블록 패딩이 필요 없으며 암호문 길이는 평문 길이와 같고, 별도의 16바이트 인증 태그가 생성된다. 복호화 시 입력된 인증 태그가 AAD 및 암호문로부터 계산된 태그와 일치하지 않으면 노드는 즉시 AUTH_TAG_MISMATCH 에러로 실패하며 평문을 방출하지 않는다.
Nonce를 절대 재사용해서는 안 된다. 단 한 번의 Nonce 충돌만으로도 평문들의 XOR 값이 노출되며 공격자가 GHASH 인증 키를 복원해 임의의 인증 태그를 위조할 수 있다.CCM (Counter with CBC-MAC)
128비트 블록 암호(AES, SEED, ARIA)를 위해 설계된 AEAD 모드로, CTR 모드 암호화와 CBC-MAC 인증 태그를 결합한다. GCM과 마찬가지로 블록 패딩 없이 암호화된 페이로드와 선택적 평문 AAD를 함께 인증하며, 복호화 시 태그 검증에 실패하면 AUTH_TAG_MISMATCH 에러를 발생시킨다.
CTR (Counter Mode)
IV로 초기화된 16바이트 카운터 블록의 연속된 값들을 암호화하여 생성한 키스트림을 평문과 XOR함으로써 블록 암호를 동기식 스트림 암호로 전환한다. 블록 패딩이 필요 없으며 임의 길이 입력을 처리할 수 있고, 암호화와 복호화 모두 블록 암호의 암호화 함수를 사용한다.
IV)를 재사용하면 키스트림이 재사용되어 평문들의 XOR가 즉시 노출된다. 또한 CTR 단독으로는 무결성을 보장하지 않으므로 암호문의 비트를 반전시키면 복호화된 평문의 동일한 비트가 그대로 반전된다.CFB (Cipher Feedback)
IV에서 시작하여 직전 암호문 블록을 블록 암호로 암호화한 뒤 그 출력을 현재 평문 블록과 XOR하여 다음 암호문 블록을 생성하는 자기 동기식 스트림 암호 모드이다. 블록 패딩이 필요 없다.
OFB (Output Feedback)
IV에서 시작하여 블록 암호 자신의 출력을 반복 암호화함으로써 평문·암호문과 독립적인 키스트림을 생성하고 이를 데이터와 XOR하는 동기식 스트림 암호 모드이다. 암호화와 복호화 연산이 완전히 동일하며 블록 패딩이 필요 없다.
XTS (XEX-based Tweaked-Codebook Mode with Ciphertext Stealing)
고정 크기 저장소 섹터(디스크 전체 암호화 등)를 암호화하기 위한 특화 모드이다. 2배 길이의 키를 두 개의 독립적인 AES 키(K1 || K2)로 분할하여 K2로 16바이트 트윅(IV 포트로 공급)을 암호화하고, K1으로 암호화된 트윅의 유한체 거듭제곱과 결합된 데이터 블록을 암호화한다. 블록에 정렬되지 않은 끝부분 바이트는 암호문 훔치기(Ciphertext Stealing)로 처리하므로 별도 패딩이 추가되지 않지만, 입력 길이가 최소 16바이트 이상이어야 한다(16바이트 미만이면 DATA_TOO_SHORT 에러 발생).
KW (AES Key Wrap)
또 다른 AES 키 암호화 키(KEK)를 사용하여 보관 또는 전송 중인 암호키를 안전하게 보호하기 위해 설계된 결정적 키 래핑(Key Wrap) 모드이다. 평문 키 자료는 반드시 8바이트(64비트 반블록)의 배수이자 최소 16바이트 이상이어야 한다. 암호화 시 8바이트 무결성 헤더가 추가되어 암호문이 평문보다 8바이트 길어지며, 복호화 시에는 래핑을 해제하고 64비트 무결성 검증값(ICV)을 확인하여 래핑된 키가 변조되었거나 잘못된 KEK가 사용된 경우 AUTH_TAG_MISMATCH 에러로 실패한다.