728x90
PKCS#7 패딩 개요
- 블록 크기: 일반적으로 8바이트(64비트) 또는 16바이트(128비트)
- 패딩 규칙:
- 패딩이 필요한 경우: N 바이트를 패딩해야 한다면, N 바이트 모두 N으로 채움
- 패딩이 필요 없는 경우(블록 크기의 정확한 배수): 전체 블록 크기만큼 패딩 추가 (block_size 바이트 모두 block_size 값으로 채움)
예시 (AES의 16바이트 블록 기준):
- 원문: YELLOW SUBMARINE (16바이트) → 패딩 추가: 0x10 0x10 ... (16번)
- 원문: YELLOW SUB (11바이트) → 패딩 추가: 0x05 0x05 0x05 0x05 0x05
PKCS#7 패딩 구현
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void pkcs7_pad(unsigned char *input, size_t input_len, size_t block_size,
unsigned char **output, size_t *output_len) {
size_t pad_len = block_size - (input_len % block_size);
*output_len = input_len + pad_len;
*output = (unsigned char *)malloc(*output_len);
if (*output == NULL) {
perror("malloc failed");
exit(1);
}
memcpy(*output, input, input_len);
memset(*output + input_len, (unsigned char)pad_len, pad_len);
}
int pkcs7_unpad(unsigned char *input, size_t input_len,
unsigned char **output, size_t *output_len) {
if (input_len == 0) return -1;
unsigned char pad_len = input[input_len - 1];
if (pad_len == 0 || pad_len > input_len) return -1;
for (size_t i = 0; i < pad_len; ++i) {
if (input[input_len - 1 - i] != pad_len)
return -1; // Invalid padding
}
*output_len = input_len - pad_len;
*output = (unsigned char *)malloc(*output_len);
if (*output == NULL) {
perror("malloc failed");
return -1;
}
memcpy(*output, input, *output_len);
return 0;
}
728x90
'Programming > C, C++' 카테고리의 다른 글
c언어 size_t 자료형에 대한 개념 (0) | 2025.06.01 |
---|---|
OpenSSL Provider에 대한 개념 (0) | 2025.05.03 |
C언어 공유라이브러리(so, dll) API 심볼 외부노출 방법 (0) | 2025.04.17 |