SM3推广美文
国密SM3摘要算法使用指南 目录算法简介算法特点应用场景API说明使用示例最佳实践常见问题 算法简介SM3是中国国家密码管理局发布的密码行业标准GM/T 0004-2012是我国自主研发的密码算法之一。它属于哈希算法摘要算法用于将任意长度的输入数据转换为固定长度的输出摘要。SM3算法的核心特点✅ 国产自主可控符合国家密码管理要求✅ 安全性高抗碰撞攻击能力强✅ 计算效率高适合各种应用场景⚡ 算法特点特性说明摘要长度256位32字节输出格式16进制字符串64字符输入长度无限制可处理任意长度数据抗碰撞性2^128抗原像性2^256计算复杂度O(n) 应用场景1. 数据完整性校验确保数据在传输过程中未被篡改// 发送方计算摘要SM3(data,len,digest1);// 接收方计算摘要SM3(data,len,digest2);// 对比摘要if(strcmp(digest1,digest2)0){// 数据完整校验通过}2. 数字签名配合SM2算法实现数字签名// 签名前先计算摘要SM3(message,len,message_hash);// 使用SM2私钥对摘要进行签名SM2_GM_signature(prikey,message_hash,hash_len,signature);3. 密码存储存储用户密码的摘要保护用户隐私// 注册时存储密码摘要SM3(password,len,password_hash);// 存储 password_hash 到数据库// 登录时验证SM3(input_password,len,input_hash);if(strcmp(input_hash,stored_hash)0){// 密码正确}4. 数字证书用于证书生成和验证5. 区块链用于区块哈希计算 API说明1. SM3 - 计算摘要输出16进制字符串intSM3(unsignedchar*input,intilen,char*out_str);参数说明input: 输入数据缓冲区ilen: 输入数据长度out_str: 输出摘要缓冲区长度至少65字节返回值0: 成功示例charsPlain[1000]Hello, World!;charsBuff[65]{0};SM3((unsignedchar*)sPlain,strlen(sPlain),sBuff);printf(SM3摘要: %s\n,sBuff);// 输出: SM3摘要: 64e87a478107b658ecc9b3c5542e05c09d8b691f5e9a5f5c5d8e9a5f5c5d8e9a2. sm3 - 计算摘要输出二进制voidsm3(unsignedchar*input,intilen,unsignedcharoutput[32]);参数说明input: 输入数据缓冲区ilen: 输入数据长度output: 输出摘要缓冲区32字节示例unsignedcharoutput[32]{0};sm3(input,len,output);// 打印十六进制for(inti0;i32;i){printf(%02x,output[i]);}printf(\n);3. sm3_file - 计算文件摘要intsm3_file(char*path,char*out_str);参数说明path: 文件路径全路径out_str: 输出摘要缓冲区长度至少65字节返回值0: 成功1: 文件打开失败2: 文件读取错误示例charout_str[65]{0};intretsm3_file(/path/to/file,out_str);if(ret0){printf(文件摘要: %s\n,out_str);}else{printf(计算失败错误码: %d\n,ret);}4. sm3_hmac - 带密钥的摘要voidsm3_hmac(unsignedchar*key,intkeylen,unsignedchar*input,intilen,unsignedcharoutput[32]);参数说明key: 密钥缓冲区keylen: 密钥长度input: 输入数据缓冲区ilen: 输入数据长度output: 输出摘要缓冲区32字节示例unsignedcharsBuff[32]{0};charsKey[64]58b21c330053d188;sm3_hmac((unsignedchar*)sKey,strlen(sKey),(unsignedchar*)sPlain,iLen,sBuff);// 打印十六进制for(intj0;j32;j){printf(%02x,sBuff[j]);}printf(\n); 使用示例基础示例计算字符串摘要#includestdio.h#includestring.h#includepub.hintmain(){charsPlain[1000]{0};charsBuff[65]{0};// 设置输入字符串sprintf(sPlain,%s,pysm4是国密SM4算法的Python! - 实现);// 计算SM3摘要SM3((unsignedchar*)sPlain,strlen(sPlain),sBuff);printf(原文: %s\n,sPlain);printf(SM3摘要: %s\n,sBuff);return0;}编译命令cc-otestsm3_test.c -L/home/lib-lbase-lc-I/home/include运行结果原文: pysm4是国密SM4算法的Python! - 实现 SM3摘要: 3a805e671ff54ab6d32a3457927790ed37d8aefb30a927b750f9be3d7096f18d高级示例数据完整性校验#includestdio.h#includestring.h#includepub.hintverify_data_integrity(constchar*original_data,constchar*received_data){chardigest1[65]{0};chardigest2[65]{0};// 计算原始数据摘要SM3((unsignedchar*)original_data,strlen(original_data),digest1);// 计算接收数据摘要SM3((unsignedchar*)received_data,strlen(received_data),digest2);// 对比摘要if(strcmp(digest1,digest2)0){printf(✓ 数据完整性校验通过\n);return1;}else{printf(✗ 数据完整性校验失败\n);printf(原始摘要: %s\n,digest1);printf(接收摘要: %s\n,digest2);return0;}}intmain(){charoriginal[100]重要数据传输;charreceived[100]重要数据传输;printf( 数据完整性校验示例 \n);verify_data_integrity(original,received);// 修改接收数据sprintf(received,%s,重要数据篡改);verify_data_integrity(original,received);return0;}️ 最佳实践1. 缓冲区大小SM3输出缓冲区: 至少65字节64字符 ‘\0’sm3输出缓冲区: 32字节固定长度sm3_hmac输出缓冲区: 32字节固定长度2. 数据类型转换// 字符串转unsigned charSM3((unsignedchar*)string,len,output);// char*转unsigned char*HMACsm3_hmac((unsignedchar*)key,keylen,(unsignedchar*)data,datalen,output);3. 错误处理// 文件摘要需要检查返回值intretsm3_file(filepath,output);if(ret!0){printf(错误: %d\n,ret);return-1;}4. 性能优化对于大文件考虑使用sm3_file直接处理对于流式数据可以分段计算后合并避免重复计算相同数据的摘要❓ 常见问题Q1: SM3和SHA256有什么区别特性SM3SHA256国家中国美国算法设计国产自主MD4设计思想摘要长度256位256位安全性国密标准NIST标准授权免费专利免费Q2: 如何验证SM3摘要的正确性可以使用在线SM3计算器验证输入相同的数据对比输出的摘要值确保使用相同的编码格式UTF-8Q3: SM3可以用于加密吗答SM3是摘要算法不是加密算法。它不可逆只能用于计算数据的摘要值不能用于加密解密。摘要算法 vs 加密算法特性摘要算法SM3加密算法SM4/SM2可逆性不可逆可逆用途数据完整性校验数据加密输出长度固定32字节可变密钥无有SM4对称/SM2非对称正确使用场景✅ 密码存储只存摘要✅ 数据完整性校验✅ 数字签名先摘要再签名错误使用场景❌ 直接加密敏感数据❌ 需要解密的场景 相关资源1. 国密标准文档GM/T 0004-2012 SM3密码杂凑算法GM/T 0002-2012 SM4分组密码算法GM/T 0003-2012 SM2椭圆曲线公钥密码算法2. 开源工具GmSSL: 支持国密算法的开源密码库OpenSSL: 支持SM3的版本1.1.13. 在线工具SM3在线计算器SM4在线加解密SM2在线签名验签 技术支持如需技术支持或合作请联系邮箱: 443016484qq.com电话:微信: