概述

国密SM3是一种由中国国家密码管理局制定的密码散列函数标准,全称为“商用密码SM3杂凑算法”。它用于提供数据完整性校验和安全性认证,类似于国际上的SHA-256等散列函数,但具有中国自主知识产权。SM3算法在多种安全应用场景中扮演关键角色,比如:电子签名、消息认证码生成、数据校验以及密码协议的安全基础等。

SM3算法的设计目标是达到至少128位的安全强度,能够抵抗已知的各种攻击方法,包括碰撞攻击、原像攻击等。其输出是一个256位的哈希值,即32个字节。SM3算法设计非常注重计算效率,在普通计算机上即可快速执行,也适合各种嵌入式系统和移动设备。

HMAC-SM3是基于SM3密码散列函数的密钥相关的消息认证码。HMAC是一种结合了密钥和哈希函数的安全机制,用于验证消息的完整性和认证发送方的身份。当使用SM3作为底层哈希函数时,就形成了HMAC-SM3。

超级好用的C++实用库之国密sm3算法_sm3算法


CHP_Sm3

为了方便使用国密SM3算法和HMAC-SM3算法,我们封装了CHP_Sm3类。CHP_Sm3类的头文件,可参考下面的示例代码。

#pragma once

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;
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

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作为可选的密码组件,以满足不同地区和行业的合规要求。


💡 需要该C++实用库源码的大佬们,可搜索微信公众号“希望睿智”。添加关注后,输入消息“超级好用的C++实用库”,即可获得源码的下载链接。