패딩 표준
ECB와 CBC 모드의 블록 암호는 온전한 블록 단위(AES·SEED·ARIA·Camellia·SM4는 16바이트, DES·TDES는 8바이트)로만 동작한다. 평문 길이가 블록 크기의 정확한 배수가 아니거나 패딩 체계가 모호하지 않은 제거(언패딩)를 요구하는 경우, 블록 경계를 맞추기 위해 패딩 바이트를 덧붙인다. NodeCrypto에서 대칭키 Encrypt·Decrypt 노드와 독립형 Block Padding 및 Block Unpadding 노드는 동일한 패딩 표준 이름을 공유한다.
| 표준 | 블록 크기 | 입력이 이미 블록 배수일 때 | 언패딩(역연산) |
|---|---|---|---|
| None | 입력 길이가 이미 블록 크기의 배수여야 함 | 그대로 사용 (배수가 아니면 에러 발생) | 지원 (무동작) |
| ISO 9797-1 M1 | 임의 블록 크기 | 아무것도 추가하지 않음 (0바이트 추가) | 지원하지 않음 |
| ISO 9797-1 M2 | 임의 블록 크기 | 패딩으로만 채운 새 블록 추가 (80 00 … 00) | 지원 |
| ISO 9797-1 M3 | 임의 블록 크기 (길이 블록도 블록 크기와 동일한 바이트 폭 사용) | 앞쪽에 온전한 길이 블록을 붙이고 방식 1 적용 | 지원 |
| PKCS#5/7 | PKCS#5는 8바이트(DES) 블록에 정의되며, PKCS#7은 동일한 알고리즘을 1~255바이트 블록으로 일반화함 | 패딩으로만 채운 새 블록 추가 | 지원 |
| NIST 800-38B | 임의 블록 크기 | 아무것도 추가하지 않음 (0바이트 추가) | 지원하지 않음 |
| ANSI X9.23 | 임의 블록 크기 (1~255바이트) | 패딩으로만 채운 새 블록 추가 | 지원 |
언패딩을 지원하지 않는 패딩 방식(Zero 및 NIST80038B)은 원본 입력이 이미 블록 크기에 정렬되어 있었을 때 끝부분 데이터 바이트와 패딩 바이트를 구분할 수 없다. 따라서 대칭키 Decrypt 노드와 Block Unpadding 노드의 선택 목록에서는 제외된다.
None (패딩 없음)
패딩 바이트를 추가하지 않는다. 블록 모드(ECB 및 CBC)에서 입력 길이가 암호 블록 크기의 정확한 배수가 아니면 실행 시 PLAINTEXT_NOT_BLOCK_ALIGNED(또는 CIPHERTEXT_NOT_BLOCK_ALIGNED) 에러가 발생한다. 데이터가 이미 블록 단위로 정렬되어 있거나, 스트림·AEAD 모드(CTR, GCM, CCM, CFB, OFB)를 사용하거나, 앞단에 Block Padding 노드를 연결해 수동으로 패딩을 적용할 때 None을 사용한다.
ISO/IEC 9797-1 Method 1 (제로 패딩)
블록 경계에 도달할 때까지 데이터 끝에 0x00 바이트를 덧붙인다. 입력 길이가 비어 있지 않고 이미 블록 크기의 배수이면 바이트를 추가하지 않는다.
0x00으로 끝나는 원본 데이터와 패딩 바이트를 구분할 수 없으므로 근본적으로 역연산이 불가능하며, Decrypt 및 Block Unpadding 노드에서는 제공되지 않는다.ISO/IEC 9797-1 Method 2 (ISO/IEC 7816-4)
필수 구분자 바이트인 0x80(단일 1 비트 뒤에 일곱 개의 0 비트)을 추가한 뒤 블록의 나머지 공간을 0x00 바이트로 채운다. 입력이 이미 블록 크기에 정렬되어 있을 때도 0x80으로 시작하는 새 블록 전체를 추가하므로, 뒤에서부터 마지막 0x80 바이트를 역방향으로 탐색하여 모호함 없이 언패딩할 수 있다.
ISO/IEC 9797-1 Method 3
원본 메시지 길이를 빅엔디안 부호 없는 정수로 인코딩한 온전한 블록 하나를 데이터 맨 앞에 붙이고, 마지막 메시지 블록의 남는 공간은 0x00 바이트(방식 1)로 채운다. 언패딩 시에는 맨 앞의 길이 블록을 읽어 원본 메시지의 정확한 바이트 길이를 복원한다.
PKCS#5 (8바이트 블록) / PKCS#7 (가변 블록)
N개의 패딩 바이트(1 ≤ N ≤ blockSize)를 추가하며, 추가되는 모든 바이트의 값을 N으로 설정한다. 입력 길이가 이미 블록 크기의 배수이면 값이 blockSize인 바이트 blockSize개로 이루어진 새 블록 전체(예: AES의 경우 0x10 16바이트)를 추가한다. 언패딩 시에는 마지막 바이트의 값을 읽어 제거하고 검증할 패딩 길이를 결정한다.
NIST SP 800-38B
CMAC 블록 구성을 위해 정의된 패딩 함수이다. 데이터가 블록 크기에 정렬되어 있지 않으면 ISO/IEC 9797-1 Method 2와 동일하게 0x80 뒤에 0x00 바이트들을 덧붙인다. 그러나 Method 2와 달리 데이터가 비어 있지 않고 이미 블록 크기의 배수이면 아무것도 추가하지 않는다.
80 00 …으로 끝나는 정렬된 평문과 패딩이 추가된 짧은 평문을 구분할 수 없다. 따라서 NIST SP 800-38B 패딩은 언패딩할 수 없으며 암호화 및 패딩 노드에서만 사용할 수 있다.ANSI X9.23
마지막 바이트를 제외한 모든 패딩 바이트를 0x00으로 채우고, 맨 마지막 바이트에 패딩 길이 N(1 ≤ N ≤ blockSize)을 기록한다. PKCS#7과 마찬가지로 입력이 이미 블록 크기에 정렬되어 있을 때도 패딩 블록 전체를 추가한다.