一、ISO9797_M1
以DES为例,8字节为一块,块对齐加密。如果数据不够8的倍数,则再后面补00,直到满足8的倍数,但如果数据满足8的倍数,则不填充.
填充前 D5 37 11 F4 C8
填充后 D5 37 11 F4 C8 00 00 00
AES和DES同理,只是AES是以16字节为一块。
二、ISO9797_M2
以DES为例,8字节为一块,块对齐加密。如果数据不够8的倍数,则再后面补一个字节0x80,如果满足8的倍数,则填充完成,但如果补了一个字节0x80,还不满足8的倍数的话,那么后续接着补0x00,直到满足8的倍数。但如果数据一开始就满足8的倍数,则需要再后面再补一字节0x80和7字节0x00
填充前 D5 37 11 F4 C8
填充后 D5 37 11 F4 C8 80 00 00
…
填充前 D5 37 11 F4 C8 A1 66
填充后 D5 37 11 F4 C8 A1 66 80
…
填充前 D5 37 11 F4 C8 A1 66 8D
填充后 D5 37 11 F4 C8 A1 66 8D 80 00 00 00 00 00 00 00
AES和DES同理,只是AES是以16字节为一块。
三、PKCS5
以DES为例,8字节为一块,块对齐加密。如果数据不够8的倍数,还差N个数据,则再后面补N个字节的N,如果满足8的倍数,则填充8字节的0x8
填充前 D5 37 11 F4 C8
填充后 D5 37 11 F4 C8 03 03 03
…
填充前 D5 37 11 F4 C8 A1 66
填充后 D5 37 11 F4 C8 A1 66 01
…
填充前 D5 37 11 F4 C8 A1 66 8D
填充后 D5 37 11 F4 C8 A1 66 8D 08 08 08 08 08 08 08 08
AES和DES同理,只是AES是以16字节为一块。
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef char s8;
typedef short s16;
typedef int s32;
s32 addISO9797M2Pad(u8* buffer, s32 bufferlen, s32 blocklen) {
s32 padlen = bufferlen%blocklen == 0 ? blocklen : blocklen-bufferlen%blocklen;
s32 i = padlen;
buffer[bufferlen++] = 0x80;
while(i-- > 0) {
buffer[bufferlen++] = 0;
}
return padlen;
}
s32 delISO9797M2Pad(u8* buffer, s32 bufferlen, s32 blocklen) {
s32 i;
for(i = bufferlen-1; (buffer[i]==0) && (i > bufferlen-blocklen) ; i--);
if(buffer[i] == 0x80) {
return bufferlen-i;
}
return -1;
}
s32 addPKCS5Pad(u8* buffer, s32 bufferlen, s32 blocklen) {
s32 padlen = bufferlen%blocklen == 0 ? blocklen : blocklen-bufferlen%blocklen;
s32 i = padlen;
while(i > 0) {
i--;
buffer[bufferlen++] = padlen;
}
return padlen;
}
s32 delPKCS5Pad(u8* buffer, s32 bufferlen, s32 blocklen) {
u32 i = buffer[bufferlen-1];
if(i < 1)
return -1;
return i;
}