国密SM3算法在linux和windows平台结果不一致问题

什么是sm3,是一种类似于sha256的哈希算法,是咱们国家的哈希标准算法;
最近在使用sm3算法时,同样的一份数据,调用同样的sm3接口,发现得到的结果是不一样的;
那么在应用过的过程中,如果同样的算法出的结果不一样,那验证签名业务就会不过,出问题;

最后发现是sm3算法在内部使用了unsigned long,
这里要注意 long, 在 windows64平台下占用4个字节 ;
而long, 在linux64平台下占用8个字节;
这种差异直接导致了windows和linux结果的差异;


原sm3.cpp 中使用了 unsigned long ,如下

1
2
3
4
5
6
7
8
9
#ifndef GET_ULONG_BE
#define GET_ULONG_BE(n,b,i)                             \
{                                                       \
    (n) = ( (unsigned long) (b)[(i)    ] << 24 )        \
        | ( (unsigned long) (b)[(i) + 1] << 16 )        \
        | ( (unsigned long) (b)[(i) + 2] <<  8 )        \
        | ( (unsigned long) (b)[(i) + 3]       );       \
}
#endif

  

//解决方式就是,修改sm3.cpp,将所有unsigned long 改成 unsigned int;
这样即支持linux和windows平台就保持一致了;

 

修改后的源码

sm3.h

  

sm3.cpp

  

测试代码test.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include "sm3.h"
 
int main () {
 
                    //test sm3_hash
                    unsigned char tp[2] = {0x1,0x2};
                    unsigned char hspV[2014] = {0};
                    int hspL = 0;
                    sm3(tp, 2, hspV);
                    FILE *fp = NULL;
                    fp = fopen("./sm3hsv.dat","wb");
                    fwrite(hspV,1,32,fp);
                    fclose(fp);
            printf("sm3=%d\n",hspL);
    return 0;
}

  最后通过md5比较生成的hash文件即可验证;

 

posted @   cocoajin  阅读(7265)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示