新闻  |   论坛  |   博客  |   在线研讨会
关于SM4填充算法PKCS5和PKCS7讲解
电子禅石 | 2024-10-14 11:28:22    阅读:16   发布文章

前言:

  今天刚好在系统上增加SM4算法的支持,SM4算法的实现网上你可以搜到很多版本,

但是如果你要运用到实际中时,你一定要了解SM4算法填充规则。


正文:

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

因此SM4的密文长度通常是16Byte的倍数。当你待加密数据小于16Byte时,

你便需要使用填充算法。


PKCS7填充算法规则:


 PKCS7填充单位为16Byte,对于不满16Byte的数据,以【16-数据长度】字符进行填充。

其实现算法如下:

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填充算法规则:

 PKCS5属于PKCS7填充单位为8Byte,对于不满8Byte的数据,以【8-数据长度】字符进行填充。其实现算法如下:

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,但实际输出结果为PKCS7。


2、如果你使用了填充算法加密数据,如果是PKCS7算法,则待加密数据为16倍数时,待加密数据尾部需要补16位0x10。


3、如果你使用了填充算法加密数据,如果是PKCS5算法,则待加密数据为8倍数时,待加密数据尾部需要补8位0x8。


4、同理解密时,如果确定加密时使用了填充算法,对于解密后的数据,需要将填充数据剔除。

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


                        

                     

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


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客