原味的SM3密码杂凑算法

  根据国家密码管理局官网发布的规范文档里的算法描述,对SM3密码杂凑算法进行了原汁原味的实现。代码里的函数、变量名称都尽量使用算法描述中的名称,尽量遵循算法描述的原始步骤,不使用算法技巧进行处理。

    算法描述里的“位”的存储在程序中用字节来存储,因此代码里会有这样的写法:unsigned char Vi[256/8],表示Vi为256位(存储为256/8字节)的意思,而对等的 unsigned char Vi[32] 则表示Vi为32字节。

    算法描述里的“字”是32字节,用 unsigned long 表示。

    最后的函数 void SM3Hash(unsigned char* m, int ml, unsigned char r[32]) 为算法主体,参数 m 是原始数据,ml 是数据长度,r 是返回值。

    本算法通过了官方文档附录里的示例验证。

#include <memory>

 

unsigned char IV[256 / 8] = { 0x73,0x80,0x16,0x6f,0x49,0x14,0xb2,0xb9,0x17,0x24,0x42,0xd7,0xda,0x8a,0x06,0x00,0xa9,0x6f,0x30,0xbc,0x16,0x31,0x38,0xaa,0xe3,0x8d,0xee,0x4d,0xb0,0xfb,0x0e,0x4e };

// 循环左移
unsigned long SL(unsigned long X, int n)
{
    unsigned __int64 x = X;
    x = x << (n % 32);
    unsigned long l = (unsigned long)(x >> 32);
    return x | l;
}

unsigned long Tj(int j)
{
    if (j <= 15)
    {
        return 0x79cc4519;
    }
    else
    {
        return 0x7a879d8a;
    }
}

unsigned long FFj(int j, unsigned long X, unsigned long Y, unsigned long Z)
{
    if (j <= 15)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值