博客專欄

        EEPW首頁 > 博客 > 關(guān)于SM4填充算法PKCS5和PKCS7講解

        關(guān)于SM4填充算法PKCS5和PKCS7講解

        發(fā)布人:電子禪石 時間:2024-10-14 來源:工程師 發(fā)布文章

        前言:

          今天剛好在系統(tǒng)上增加SM4算法的支持,SM4算法的實現(xiàn)網(wǎng)上你可以搜到很多版本,

        但是如果你要運用到實際中時,你一定要了解SM4算法填充規(guī)則。


        正文:

          首先,SM4接口大多是以最小單位16Byte進行加解密。

        因此SM4的密文長度通常是16Byte的倍數(shù)。當(dāng)你待加密數(shù)據(jù)小于16Byte時,

        你便需要使用填充算法。


        PKCS7填充算法規(guī)則:


         PKCS7填充單位為16Byte,對于不滿16Byte的數(shù)據(jù),以【16-數(shù)據(jù)長度】字符進行填充。

        其實現(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;
        }

        PKCS5填充算法規(guī)則:

         PKCS5屬于PKCS7填充單位為8Byte,對于不滿8Byte的數(shù)據(jù),以【8-數(shù)據(jù)長度】字符進行填充。其實現(xiàn)算法如下:

        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;
        }

         

        注意事項:

        1、如果你使用的是SM4算法,你直接使用PKCS7填充即可,之前我遇到過JAVA的API里寫著使用PKCS5,但實際輸出結(jié)果為PKCS7。


        2、如果你使用了填充算法加密數(shù)據(jù),如果是PKCS7算法,則待加密數(shù)據(jù)為16倍數(shù)時,待加密數(shù)據(jù)尾部需要補16位0x10。


        3、如果你使用了填充算法加密數(shù)據(jù),如果是PKCS5算法,則待加密數(shù)據(jù)為8倍數(shù)時,待加密數(shù)據(jù)尾部需要補8位0x8。


        4、同理解密時,如果確定加密時使用了填充算法,對于解密后的數(shù)據(jù),需要將填充數(shù)據(jù)剔除。

        ————————————————


                                

                             

        原文鏈接:https://blog.csdn.net/wjb123sw99/article/details/105015933


        *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



        關(guān)鍵詞: sm4

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 沙雅县| 兰西县| 吉隆县| 建湖县| 和平区| 绵阳市| 壶关县| 西充县| 湟源县| 广水市| 甘孜| 河间市| 瓦房店市| 贞丰县| 左云县| 锦州市| 徐水县| 内丘县| 仲巴县| 乐山市| 汉川市| 慈溪市| 板桥市| 沐川县| 石台县| 通江县| 海宁市| 高台县| 安福县| 西藏| 嘉鱼县| 乌兰县| 江山市| 福贡县| 朝阳县| 永城市| 阳朔县| 林芝县| 贺兰县| 沙田区| 天水市|