概述
国密SM3是一种由中国国家密码管理局制定的密码散列函数标准,全称为“商用密码SM3杂凑算法”。它用于提供数据完整性校验和安全性认证,类似于国际上的SHA-256等散列函数,但具有中国自主知识产权。SM3算法在多种安全应用场景中扮演关键角色,比如:电子签名、消息认证码生成、数据校验以及密码协议的安全基础等。
SM3算法的设计目标是达到至少128位的安全强度,能够抵抗已知的各种攻击方法,包括碰撞攻击、原像攻击等。其输出是一个256位的哈希值,即32个字节。SM3算法设计非常注重计算效率,在普通计算机上即可快速执行,也适合各种嵌入式系统和移动设备。
HMAC-SM3是基于SM3密码散列函数的密钥相关的消息认证码。HMAC是一种结合了密钥和哈希函数的安全机制,用于验证消息的完整性和认证发送方的身份。当使用SM3作为底层哈希函数时,就形成了HMAC-SM3。
CHP_Sm3
为了方便使用国密SM3算法和HMAC-SM3算法,我们封装了CHP_Sm3类。CHP_Sm3类的头文件,可参考下面的示例代码。
class CHP_Sm3 { public: CHP_Sm3(); ~CHP_Sm3(); void Init(); int Update(unsigned char *pucInput, int nInputLen); int Final(unsigned char pucOutput[32]); int InitHmac(unsigned char *pucKey, int nKeyLen); int UpdateHmac(unsigned char *pucInput, int nInputLen); int FinalHmac(unsigned char pucOutput[32]); static int CalcDigest(unsigned char *pucInput, int nInputLen, unsigned char pucOutput[32]); static int CalcDigestHmac(unsigned char *pucKey, int nKeyLen, unsigned char *pucInput, int nInputLen, unsigned char pucOutput[32]); private: void Process(unsigned char pucData[64]); private: typedef struct _TSm3ContextInfo { unsigned int puiTotal[2]; unsigned int puiState[8]; unsigned char pucBuffer[64]; unsigned char pucPadIn[64]; unsigned char pucPadOut[64]; }TSm3ContextInfo; TSm3ContextInfo m_ctx; };
CHP_Sm3类有8个公共成员函数,包括6个实例函数和2个静态函数,下面逐一进行介绍。
Init:初始化sm3算法。
Update:更新输入数据。参数pucInput为输入数据buffer,参数nInputLen为输入数据的长度。返回值为0表示成功,其他为错误码。
Final:完成摘要计算。参数pucOutput为计算出的摘要值,用于传出。返回值为0表示成功,其他为错误码。
InitHmac:初始化HMAC-SM3算法。参数pucKey为密钥buffer,参数nKeyLen为密钥长度。返回值为0表示成功,其他为错误码。
UpdateHmac:更新输入数据。参数pucInput为输入数据buffer,参数nInputLen为输入数据的长度。返回值为0表示成功,其他为错误码。
FinalHmac:完成摘要计算。参数pucOutput为计算出的摘要值,用于传出。返回值为0表示成功,其他为错误码。
CalcDigest:静态成员函数,计算输入数据的sm3摘要值,是对上面几个接口的封装,方便应用层调用。参数pucInput为输入数据buffer,参数nInputLen为输入数据的长度。参数pucOutput为计算出的摘要值,用于传出。返回值为0表示成功,其他为错误码。
CalcDigestHmac:静态成员函数,计算输入数据的hmac-sm3摘要值,是对上面几个接口的封装,方便应用层调用。参数pucKey为密钥buffer,参数nKeyLen为密钥长度。参数pucInput为输入数据buffer,参数nInputLen为输入数据的长度。参数pucOutput为计算出的摘要值,用于传出。返回值为0表示成功,其他为错误码。
总结
SM3算法于2010年正式发布,成为国家商用密码体系的重要组成部分。随着信息安全自主可控的推进,SM3在国内的应用越来越广泛,并逐步向国际推广。在一些国际标准和协议中,也开始考虑兼容或采纳SM3作为可选的密码组件,以满足不同地区和行业的合规要求。