關(guān)于SM4填充算法PKCS5和PKCS7講解
前言:
今天剛好在系統(tǒng)上增加SM4算法的支持,SM4算法的實(shí)現(xiàn)網(wǎng)上你可以搜到很多版本,
但是如果你要運(yùn)用到實(shí)際中時(shí),你一定要了解SM4算法填充規(guī)則。
正文:
首先,SM4接口大多是以最小單位16Byte進(jìn)行加解密。
因此SM4的密文長(zhǎng)度通常是16Byte的倍數(shù)。當(dāng)你待加密數(shù)據(jù)小于16Byte時(shí),
你便需要使用填充算法。
PKCS7填充算法規(guī)則:
PKCS7填充單位為16Byte,對(duì)于不滿16Byte的數(shù)據(jù),以【16-數(shù)據(jù)長(zhǎng)度】字符進(jìn)行填充。
其實(shí)現(xiàn)算法如下:
int PKCS7(unsigned char *pucData, unsigned long ulDataLen, unsigned char pucPaddingData[16]) { unsigned char pucPadding = 0; if(ulDataLen > 16) { return -1; } pucPadding = 16 - ulDataLen; memcpy(pucPaddingData, pucData, ulDataLen); memset(pucPaddingData + ulDataLen, pucPadding, 16 - ulDataLen); return 0; }
int PKCS5(unsigned char *pucData, unsigned long ulDataLen, unsigned char pucPaddingData[8]) { unsigned char pucPadding = 0; if(ulDataLen > 8) { return -1; } pucPadding = 8 - ulDataLen; memcpy(pucPaddingData, pucData, ulDataLen); memset(pucPaddingData + ulDataLen, pucPadding, 8 - ulDataLen); return 0; }
注意事項(xiàng):
1、如果你使用的是SM4算法,你直接使用PKCS7填充即可,之前我遇到過JAVA的API里寫著使用PKCS5,但實(shí)際輸出結(jié)果為PKCS7。
2、如果你使用了填充算法加密數(shù)據(jù),如果是PKCS7算法,則待加密數(shù)據(jù)為16倍數(shù)時(shí),待加密數(shù)據(jù)尾部需要補(bǔ)16位0x10。
3、如果你使用了填充算法加密數(shù)據(jù),如果是PKCS5算法,則待加密數(shù)據(jù)為8倍數(shù)時(shí),待加密數(shù)據(jù)尾部需要補(bǔ)8位0x8。
4、同理解密時(shí),如果確定加密時(shí)使用了填充算法,對(duì)于解密后的數(shù)據(jù),需要將填充數(shù)據(jù)剔除。
————————————————
原文鏈接:https://blog.csdn.net/wjb123sw99/article/details/105015933
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。