NodeCrypto 도움말

패딩 표준

ECB와 CBC 모드의 블록 암호는 온전한 블록 단위(AES·SEED·ARIA·Camellia·SM4는 16바이트, DES·TDES는 8바이트)로만 동작한다. 평문 길이가 블록 크기의 정확한 배수가 아니거나 패딩 체계가 모호하지 않은 제거(언패딩)를 요구하는 경우, 블록 경계를 맞추기 위해 패딩 바이트를 덧붙인다. NodeCrypto에서 대칭키 Encrypt·Decrypt 노드와 독립형 Block Padding 및 Block Unpadding 노드는 동일한 패딩 표준 이름을 공유한다.

블록 1 (16바이트) 잔여 데이터 (10B) + 패딩 (6B) 블록 암호 (ECB / CBC) 정확한 16B 블록 경계 정렬되지 않은 끝부분 바이트에 패딩을 채워 마지막 암호 블록을 완성한다
표준블록 크기입력이 이미 블록 배수일 때언패딩(역연산)
None입력 길이가 이미 블록 크기의 배수여야 함그대로 사용 (배수가 아니면 에러 발생)지원 (무동작)
ISO 9797-1 M1임의 블록 크기아무것도 추가하지 않음 (0바이트 추가)지원하지 않음
ISO 9797-1 M2임의 블록 크기패딩으로만 채운 새 블록 추가 (80 00 … 00)지원
ISO 9797-1 M3임의 블록 크기 (길이 블록도 블록 크기와 동일한 바이트 폭 사용)앞쪽에 온전한 길이 블록을 붙이고 방식 1 적용지원
PKCS#5/7PKCS#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을 사용한다.

16바이트 블록 (이미 정렬됨) — 원본 16B → 패딩 후 16B
4142434445464748494a4b4c4d4e4f50
원본 데이터

ISO/IEC 9797-1 Method 1 (제로 패딩)

표준: ISO/IEC 9797-1:2011, Padding Method 1
블록 크기: 임의 블록 크기
언패딩(역연산): 지원하지 않음 (단방향)

블록 경계에 도달할 때까지 데이터 끝에 0x00 바이트를 덧붙인다. 입력 길이가 비어 있지 않고 이미 블록 크기의 배수이면 바이트를 추가하지 않는다.

MAC 계산(리테일 CBC-MAC 등)을 위해 고안된 방식이다. 0x00으로 끝나는 원본 데이터와 패딩 바이트를 구분할 수 없으므로 근본적으로 역연산이 불가능하며, Decrypt 및 Block Unpadding 노드에서는 제공되지 않는다.
16바이트 블록 (미정렬 → 0x00 바이트 추가) — 원본 10B → 패딩 후 16B
4142434445464748494a000000000000
원본 데이터패딩 바이트
16바이트 블록 (이미 정렬됨 → 무동작) — 원본 16B → 패딩 후 16B
4142434445464748494a4b4c4d4e4f50
원본 데이터

ISO/IEC 9797-1 Method 2 (ISO/IEC 7816-4)

표준: ISO/IEC 9797-1:2011 Method 2 / ISO/IEC 7816-4 (스마트카드 APDU 패딩)
블록 크기: 임의 블록 크기
언패딩(역연산): 지원

필수 구분자 바이트인 0x80(단일 1 비트 뒤에 일곱 개의 0 비트)을 추가한 뒤 블록의 나머지 공간을 0x00 바이트로 채운다. 입력이 이미 블록 크기에 정렬되어 있을 때도 0x80으로 시작하는 새 블록 전체를 추가하므로, 뒤에서부터 마지막 0x80 바이트를 역방향으로 탐색하여 모호함 없이 언패딩할 수 있다.

16바이트 블록 — 원본 10B → 패딩 후 16B
4142434445464748494a800000000000
원본 데이터패딩 바이트

ISO/IEC 9797-1 Method 3

표준: ISO/IEC 9797-1:2011, Padding Method 3
블록 크기: 임의 블록 크기 (길이 블록은 블록 크기와 동일)
언패딩(역연산): 지원

원본 메시지 길이를 빅엔디안 부호 없는 정수로 인코딩한 온전한 블록 하나를 데이터 맨 앞에 붙이고, 마지막 메시지 블록의 남는 공간은 0x00 바이트(방식 1)로 채운다. 언패딩 시에는 맨 앞의 길이 블록을 읽어 원본 메시지의 정확한 바이트 길이를 복원한다.

원래 MAC 알고리즘(ISO/IEC 9797-1 MAC Algorithm 3 / ANSI X9.19)을 위해 정의된 방식이다. 앞에 길이 블록이 추가되므로 패딩 결과는 항상 원본보다 최소 한 블록 이상 길어진다.
16바이트 블록 — 원본 10B (길이 블록에 바이트·비트 규약으로 저장) → 패딩 후 32B
0000000000000000000000000000000a4142434445464748494a000000000000
길이 블록원본 데이터패딩 바이트

PKCS#5 (8바이트 블록) / PKCS#7 (가변 블록)

표준: PKCS#5 v1.5 (8바이트 DES 블록) / PKCS#7 — RFC 5652 §6.3 (CMS)
블록 크기: 1~255바이트
언패딩(역연산): 지원

N개의 패딩 바이트(1 ≤ N ≤ blockSize)를 추가하며, 추가되는 모든 바이트의 값을 N으로 설정한다. 입력 길이가 이미 블록 크기의 배수이면 값이 blockSize인 바이트 blockSize개로 이루어진 새 블록 전체(예: AES의 경우 0x10 16바이트)를 추가한다. 언패딩 시에는 마지막 바이트의 값을 읽어 제거하고 검증할 패딩 길이를 결정한다.

16바이트 블록 (AES/SEED/ARIA/Camellia/SM4, PKCS#7) — 원본 10B → 패딩 후 16B
4142434445464748494a060606060606
원본 데이터패딩 바이트
8바이트 블록 (DES/TDES, PKCS#5) — 원본 5B → 패딩 후 8B
4142434445030303
원본 데이터패딩 바이트

NIST SP 800-38B

표준: NIST Special Publication 800-38B (CMAC 인증 모드)
블록 크기: 임의 블록 크기
언패딩(역연산): 지원하지 않음 (단방향)

CMAC 블록 구성을 위해 정의된 패딩 함수이다. 데이터가 블록 크기에 정렬되어 있지 않으면 ISO/IEC 9797-1 Method 2와 동일하게 0x80 뒤에 0x00 바이트들을 덧붙인다. 그러나 Method 2와 달리 데이터가 비어 있지 않고 이미 블록 크기의 배수이면 아무것도 추가하지 않는다.

정렬된 입력을 그대로 유지하므로 80 00 …으로 끝나는 정렬된 평문과 패딩이 추가된 짧은 평문을 구분할 수 없다. 따라서 NIST SP 800-38B 패딩은 언패딩할 수 없으며 암호화 및 패딩 노드에서만 사용할 수 있다.
16바이트 블록 (미정렬 → 0x80 + 0x00 추가) — 원본 10B → 패딩 후 16B
4142434445464748494a800000000000
원본 데이터패딩 바이트
16바이트 블록 (이미 정렬됨 → ISO 9797-1 M2와 달리 무동작) — 원본 16B → 패딩 후 16B
4142434445464748494a4b4c4d4e4f50
원본 데이터

ANSI X9.23

표준: ANSI X9.23 (금융 기관 메시지 암호화)
블록 크기: 1~255바이트
언패딩(역연산): 지원

마지막 바이트를 제외한 모든 패딩 바이트를 0x00으로 채우고, 맨 마지막 바이트에 패딩 길이 N(1 ≤ N ≤ blockSize)을 기록한다. PKCS#7과 마찬가지로 입력이 이미 블록 크기에 정렬되어 있을 때도 패딩 블록 전체를 추가한다.

16바이트 블록 — 원본 10B → 패딩 후 16B
4142434445464748494a000000000006
원본 데이터패딩 바이트