DES 나 TripleDES, BlowFish 같은 대칭키 블록 알고리즘은 정해진 길이(block size)의 KEY 와 IV(Initial Vector) 를 사용해서 암호화를 합니다.

물론 운영 모드가 CBC 일 경우에만 IV 가 필요하지만 대개의 경우 CBC mode 를 사용하므로 IV 는 필수입니다.


블록 알고리즘이라는 명칭에서 알수 있듯이 암호화/복호화시 입력 데이터는 정해진 블록 크기만큼 잘라서 처리해야 하는데 모든 데이터가 블록의 배수일수 없으니 데이터 패딩(padding) 이 필요합니다.


PKCS#5 패딩

PKCS5 padding 은 RFC 2898 인 "Password-based Encryption Standard" 에 정의된 패딩 방식으로 암호화하려는 데이터가 블록의 배수가 아닐 경우 다음과 같이 부족한 길이만큼 패딩을 하는 방식입니다.

예로 원본 데이타가 AB 라는 값으로 끝나고 8바이트가 블록 사이즈인데 암호화하려는 원본이 17 바이트라면 2개의 블록과 1바이트가 암호화 대상이 됩니다.

블록 크기만큼 맞추려면 7바이트가 부족하므로 다음과 같이 07 을 7번 패딩합니다.

AB 07 07 07 07 07 07 07
BASH


3 바이트가 부족할 경우 03 을 3번 패딩하면 됩니다.

AB A1 08 01 0A 03 03 03
BASH


만약 원본 데이타 길이가 블록 배수라면 어떻게 할까요?

이럴 경우 보통 한 개의 블록만큼 패딩 바이트를 추가해서 암호화하고 복호화시에는 떼어냅니다.

즉 8바이트가 블록일 경우 원본 데이터 크기가 8의 배수(8, 16, 24, ...) 라면 맨 뒤에 다음 패딩이 붙게 됩니다.

08 08 08 08 08 08 08 08
CODE


수식으로 표현하면 전체 블록의 크기인 length 를 블록 사이즈(8) 로 나머지 연산한 값에 따라 아래와 같은 패딩이 붙게 되며 블록 사이즈와 일치할 경우 블록 사이즈를 표시하는 바이트가 k 개가 붙게 됩니다.

if length mod k = k -1 ---> 01
if length mod k = k -2 ---> 02 02
...
if length mod k = 0    ---> k k k k k ... k (k개 붙음)
CODE


예로 PKCS#5 padding 의 길이는 블록 크기에 부족한 바이트에 따라 아래와 같은 패딩이 붙게 됩니다.

01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06
07 07 07 07 07 07 07
08 08 08 08 08 08 08 08
CODE

PKCS#7 패딩

AES 같은 현대적인 암호화 알고리즘은 128, 192, 256 같은 훨씬 더 긴 길이의 키를 사용하며 블록 크기도 8 byte 가 아닌 128 bit(16 bytes) 를 사용하지만 PKCS#5 padding 은 블록 사이즈가 64 bit(8 byte) 에 대해서만 정의되어 있습니다.

PKCS#7 padding 은 최대 16 byte 까지의 블록 사이즈에 대해서도 동작하도록 정의한 것만 빼고는 PKCS#5 padding 과 동작 방식이 동일합니다


같이 보기

Ref