当前位置: 首页 > article >正文

从SHA-256到SM3:手把手教你用Verilog移植一个国密哈希算法IP核

从SHA-256到SM3手把手教你用Verilog移植一个国密哈希算法IP核在硬件安全领域哈希算法作为密码学基础组件其高效实现直接影响着系统整体性能。对于已经掌握SHA-256等国际标准算法硬件实现的开发者而言转向国密SM3算法时往往面临两个选择从零开始重写或基于现有设计进行移植优化。本文将聚焦后者通过对比分析两种算法的架构异同展示如何将成熟的SHA-256硬件设计转化为符合国密标准的SM3实现。1. 算法结构对比与移植策略1.1 消息填充机制异同SHA-256和SM3都采用Merkle-Damgård结构这意味着它们的消息填充流程存在共性// 通用填充逻辑框架 always (posedge clk) begin if (last_word_received) begin append_0x80_byte(); pad_with_zeros(); append_message_length(); end end但细节差异需要特别注意特性SHA-256SM3长度表示方式64位大端序64位大端序最小填充量9字节(0x808字节长度)9字节(0x808字节长度)块边界512位512位特殊处理无支持非对齐尾字(2b00-2b11)移植时需要修改填充状态机特别是增加对非完整尾字的处理逻辑case (msg_bytes_num) 2b00: padding_out {msg_in[31:24], 24h800000}; 2b01: padding_out {msg_in[31:16], 16h8000}; 2b10: padding_out {msg_in[31:8], 8h80}; default: padding_out msg_in; endcase1.2 消息扩展模块改造消息扩展是差异最显著的部分。SHA-256仅生成64个32位字而SM3需要产生132个字W0-W67和W0-W63。原有设计需要彻底重构// SM3扩展核心逻辑 wire [31:0] tmp0 w0 ^ w7 ^ {w13[16:0], w13[31:17]}; wire [31:0] tmp1 tmp0 ^ {tmp0[16:0], tmp0[31:17]} ^ {tmp0[8:0], tmp0[31:9]}; wire [31:0] w16 tmp1 ^ {w3[24:0], w3[31:25]} ^ w10;关键改造点包括将16字的滑动窗口扩展为支持132字生成增加Wj计算路径Wj ^ Wj4修改控制逻辑支持68轮扩展原SHA-256为64轮注意SM3的扩展非线性变换引入了更多循环移位操作需要仔细验证位宽和方向1.3 压缩函数适配方案压缩函数虽然都采用64轮迭代但内部操作差异显著// SM3特有的布尔函数 wire [31:0] FFj (j 16) ? (A ^ B ^ C) : ((A B) | (A C) | (B C)); wire [31:0] GGj (j 16) ? (E ^ F ^ G) : ((E F) | (~E G));主要移植工作包括替换SHA-256的Ch/Maj函数为SM3的FFj/GGj增加P0/P1置换函数实现修改轮常量生成逻辑TJ0/TJ1调整工作变量更新路径2. 关键模块Verilog实现2.1 可配置顶层接口设计为保持接口兼容性顶层模块可复用原有信号定义仅内部实现变化module sm3_top ( input clk, input rst_n, input [31:0] msg_in, input msg_in_vld, output msg_in_ready, input msg_is_last_word, input [1:0] msg_bytes_num, output [255:0] hash_out, output hash_out_vld ); // 实例化改造后的子模块 msg_padding u_padding(...); msg_expansion u_expansion(...); compress_func u_compress(...); endmodule2.2 消息扩展优化实现采用寄存器重映射技术减少硬件开销always (posedge clk) begin if (state EXPAND) begin w[15:0] {w[14:0], new_word}; // 滑动窗口 wj0 w[11]; // Wj wj1 w[11] ^ w[15]; // Wj end end资源优化技巧复用SHA-256的寄存器堆存储中间结果采用并行计算缩短关键路径共享循环移位运算单元2.3 压缩函数流水线优化通过四级流水提升吞吐量// 第一级计算布尔函数 stage1_ffj FFj(A, B, C, round); stage1_ggj GGj(E, F, G, round); // 第二级计算SS1/SS2 stage2_ss1 SS1(stage1_ffj, D, wj1); stage2_ss2 SS2(A, E, Tj); // 第三级计算TT1/TT2 stage3_tt1 TT1(stage2_ss1, stage1_ffj); stage3_tt2 TT2(stage2_ss2, stage1_ggj); // 第四级更新工作变量 {A, B, C, D} {stage3_tt1, A, B, C}; {E, F, G, H} {stage3_tt2, E, F, G};3. 验证方法与测试策略3.1 兼容性测试框架构建通用测试平台支持两种算法验证module hash_tb; // 可配置算法选择 parameter ALG_SHA256 0; parameter ALG_SM3 1; reg algorithm_sel; hash_core uut(..., .algorithm(algorithm_sel)); initial begin // 测试SM3 algorithm_sel ALG_SM3; run_test_vector(SM3_TEST_CASE); // 测试SHA-256 algorithm_sel ALG_SHA256; run_test_vector(SHA256_TEST_CASE); end endmodule3.2 交叉验证技术利用已知正确的软件实现进行协同验证# Python验证脚本 import hashlib def sm3_software(msg): # 调用标准库实现 ... def compare_results(hw_output, sw_reference): # 比对硬件输出与软件结果 ...3.3 性能评估指标建立统一的评估体系指标SHA-256实现SM3移植版改进方向吞吐量(Mbps)1200980优化关键路径逻辑单元(LE)85009200资源共享时钟频率(MHz)200180流水线平衡功耗(mW/MHz)1.21.4门控时钟优化4. 工程实践中的经验分享4.1 状态机设计陷阱在消息填充状态机改造时我们曾遇到一个典型问题SM3对非对齐尾字的处理可能导致状态跳转错误。解决方案是增加专门的字节计数器reg [1:0] byte_counter; // 跟踪有效字节数 always (posedge clk) begin if (msg_in_vld msg_is_last_word) byte_counter msg_bytes_num; end4.2 时序收敛技巧SM3的扩展模块因非线性操作较多容易成为时序瓶颈。通过以下方法改善将关键路径上的组合逻辑拆分为两级寄存器对循环移位操作进行预计算采用寄存器复制降低扇出4.3 验证覆盖率提升为确保移植后的设计可靠我们采用分层验证策略单元级验证每个子模块独立测试消息填充验证各种边界条件扩展模块检查132字生成正确性压缩函数逐轮验证状态更新集成测试全流程数据通路验证多分组消息处理连续数据流测试异常情况注入如复位测试系统级验证与上位机协议栈对接测试长期稳定性测试随机化压力测试

相关文章:

从SHA-256到SM3:手把手教你用Verilog移植一个国密哈希算法IP核

从SHA-256到SM3:手把手教你用Verilog移植一个国密哈希算法IP核 在硬件安全领域,哈希算法作为密码学基础组件,其高效实现直接影响着系统整体性能。对于已经掌握SHA-256等国际标准算法硬件实现的开发者而言,转向国密SM3算法时往往面…...

别再乱配了!Nacos 2.2.3+ 鉴权开启后,Spring Boot项目连不上的几个常见坑点

Nacos 2.2.3鉴权实战:Spring Boot连接失败的深度排查指南 当Nacos升级到2.2.3版本后,鉴权机制的变化让不少开发者踩了坑。特别是那些从老版本迁移过来的Spring Boot项目,明明配置看起来没问题,却总是连不上配置中心。本文将带你直…...

GESP5级C++考试语法知识(十四、贪心算法(二)区间问题(提高级))

🌟《贪心王国打点小精灵大作战》🏰 一、故事开场在贪心王国里,有一片神秘的区域森林 🌲森林里有很多“魔法区间”,比如:👉 [1,5] 👉 [2,6] 👉 [4,7]😈 危机来…...

别再只用相关系数了!用Matlab的wcoherence函数,5分钟画出时间序列的交叉小波相干图

别再只用相关系数了!用Matlab的wcoherence函数,5分钟画出时间序列的交叉小波相干图 当我们面对两组时间序列数据时,传统的相关系数只能给出一个笼统的关联度指标,而无法揭示不同时间尺度下的动态关联模式。比如分析股票价格与成交…...

基于Coze平台的课堂语音互动机器人设计与实现

基于Coze平台的课堂语音互动机器人设计与实现 摘要 随着人工智能技术的快速发展,大语言模型驱动的智能体(Agent)在教育领域的应用日益广泛。本文基于字节跳动推出的Coze(扣子)AI开发平台,设计并实现了一款面向课堂教学场景的语音互动机器人。该机器人模拟多个具有鲜明性…...

从个人到团队:基于快马平台实战开发一个可协作的WorkBuddy任务管理工具

从个人到团队:基于快马平台实战开发一个可协作的WorkBuddy任务管理工具 最近团队内部一直在寻找一个轻量级的任务协作工具,市面上现有的方案要么功能过于复杂,要么定制化程度不够。于是决定自己动手,用InsCode(快马)平台快速搭建…...

如何一键获取Steam游戏清单:Onekey工具的终极指南

如何一键获取Steam游戏清单:Onekey工具的终极指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为复杂的Steam游戏清单下载而烦恼吗?Onekey Steam Depot清单下载工…...

当Matplotlib遇到Seaborn:网格线风格如何统一?一个案例搞定多图排版

当Matplotlib遇到Seaborn:网格线风格统一与多图排版实战指南 在数据可视化领域,Matplotlib和Seaborn是Python生态中最常用的两个库。Matplotlib提供了基础的绘图功能,而Seaborn则在Matplotlib基础上封装了更高级的统计图表和美观的默认样式。…...

数字英语验证码识别API集成指南

本文将为您介绍数字英语验证码识别API的集成指南。该API基于深度学习技术,能够识别可变长度的英语数字验证码。您只需输入验证码图片的内容,即可获取验证码的识别结果。 环境准备 在使用API之前,您需要在 数字英语验证码识别API 页面申请相…...

Suno Tasks API 的集成与使用指南

简介 Suno Tasks API 是 Ace Data Cloud 提供的一项强大服务,主要用于查询通过 Suno Audios Generation API 或 Suno Lyrics Generation API 生成的任务的执行状态。本文将详细介绍如何集成和使用 Suno Tasks API,帮助开发者轻松查询任务状态&#xff0…...

【Java服务网格实战权威指南】:20年架构师亲授Istio+Spring Cloud双模落地的5大避坑法则

更多请点击: https://intelliparadigm.com 第一章:Java服务网格的核心演进与双模架构认知 Java 生态长期以 Spring Cloud 和 Dubbo 为代表构建微服务治理能力,但随着云原生基础设施成熟,服务网格(Service Mesh&#x…...

新手入门Graphify:基于快马平台实现首个社交网络关系图

今天想和大家分享一个特别适合新手入门的Graphify项目——用D3.js实现社交网络关系图。作为刚接触图论可视化的小白,我最初看到那些复杂的连线图总觉得无从下手,直到在InsCode(快马)平台尝试了这个项目,才发现原来入门可以这么简单。 搭建基础…...

GARbro视觉小说资源浏览器:5步掌握游戏资源提取终极指南

GARbro视觉小说资源浏览器:5步掌握游戏资源提取终极指南 【免费下载链接】GARbro Visual Novels resource browser 项目地址: https://gitcode.com/gh_mirrors/ga/GARbro GARbro是一款专为视觉小说爱好者设计的游戏资源浏览器,能够帮助你轻松访问…...

调试实录:一次SATA硬盘读写异常,我是如何通过分析FIS命令流定位到内核驱动内存分配Bug的

从FIS命令流异常到内核内存分配:一次SATA硬盘故障的深度追踪 那是一个再普通不过的周四下午,直到监控系统突然发出刺耳的警报——生产环境中的多台服务器相继报告SATA存储设备出现间歇性读写失败。作为团队中负责存储子系统稳定的工程师,我迅…...

别再死记UNet结构了!用PyTorch手搓一个医学细胞分割模型(附ISBI数据集实战代码)

别再死记UNet结构了!用PyTorch手搓一个医学细胞分割模型(附ISBI数据集实战代码) 医学图像分割一直是计算机视觉领域的重要研究方向,尤其在细胞分析、病理诊断等场景中,精确的分割结果能为后续研究提供可靠基础。传统方…...

保姆级教程:用`ipvsadm`和`iptables-save`命令,一步步拆解K8s Service的流量转发路径

深入拆解Kubernetes Service流量转发:从命令行视角看ipvs与iptables的协同 当你第一次在Kubernetes集群中创建一个Service时,有没有好奇过这个虚拟IP背后究竟发生了什么?为什么一个ClusterIP能够稳定地将流量路由到可能随时变化的Pod上&#…...

2025最权威的五大AI科研助手横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 一键论文生成器是智能写作辅助系统,运用自然语言处理和深度学习技术,…...

3步掌握Krita AI绘画:面向初学者的完整指南

3步掌握Krita AI绘画:面向初学者的完整指南 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitcode.com/gh_mi…...

LinkSwift:八大网盘直链解析工具终极指南,一键解锁高速下载新体验

LinkSwift:八大网盘直链解析工具终极指南,一键解锁高速下载新体验 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘…...

3步实战精通Photoshop AVIF插件:让你的图像体积减少60%的终极指南

3步实战精通Photoshop AVIF插件:让你的图像体积减少60%的终极指南 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format 你是否曾经因为网站图片加载太慢而…...

DeepGEMM 核心技术解析:批次不变性、确定性与 FP8 优化的统一

核心主张: DeepGEMM 的价值不是更高的 FLOPS,而是将效率、确定性、批次不变性三者统一——这才是大规模分布式训练真正需要的。 适读人群: 大模型架构师、Infra 工程师、关注 AI 底层优化的技术决策者 阅读时长: 约 18 分钟 核心收益: 理解 GEMM 优化的工程维度,掌握批次…...

WinBtrfs v1.9深度解析:如何在Windows上构建企业级Btrfs存储解决方案

WinBtrfs v1.9深度解析:如何在Windows上构建企业级Btrfs存储解决方案 【免费下载链接】btrfs WinBtrfs - an open-source btrfs driver for Windows 项目地址: https://gitcode.com/gh_mirrors/bt/btrfs WinBtrfs v1.9作为Windows平台最成熟的开源Btrfs驱动程…...

3步解锁Nintendo Switch无限潜能:大气层系统完整指南

3步解锁Nintendo Switch无限潜能:大气层系统完整指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 你是否想让自己的Nintendo Switch拥有更多可能性?大气层&#…...

终极指南:5分钟掌握微信聊天记录解密,找回丢失的珍贵数据

终极指南:5分钟掌握微信聊天记录解密,找回丢失的珍贵数据 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾经因为手机故障、系统重装或误操作,导致那些珍贵的微…...

OpenSpeedy终极指南:免费开源游戏变速工具完整教程

OpenSpeedy终极指南:免费开源游戏变速工具完整教程 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy OpenSpeedy是一款完全免费且开源的游戏变速工具,专…...

两小时速成:如何用快马AI将你的小程序创意快速变为可运行原型

作为一个16岁的中学生,我最近用InsCode(快马)平台在两小时内就做出了一个学习计划管理小程序。整个过程比想象中简单多了,特别适合像我这样刚接触编程的新手。下面分享我的快速原型开发经验: 明确需求很关键 在开始前,我先用纸笔列…...

全栈项目模板:现代Web应用开发的瑞士军刀与最佳实践

1. 项目概述:一个全栈开发者的“瑞士军刀”在当今快节奏的软件开发领域,无论是独立开发者还是小型团队,启动一个新项目时最耗时的往往不是核心业务逻辑的编写,而是那些重复性的基础搭建工作:前后端框架选型、环境配置、…...

大语言模型驱动参数化设计:ChatGPT与Grasshopper集成实战

1. 项目概述:当参数化设计遇上大语言模型 如果你是一名建筑师、设计师,或者任何在Rhino和Grasshopper环境中工作的创意人士,那么你肯定对“参数化设计”这个概念不陌生。通过定义一系列参数和逻辑关系,我们可以创建出能够响应变化…...

【2026高频交易基础设施白皮书节选】:C++内存池必须支持的4项新特性——PCIe Gen6 DMA直通、TSX-E增强、RAS校验及冷热页动态迁移

更多请点击: https://intelliparadigm.com 第一章:2026高频交易内存池演进全景图 2026年,全球头部量化机构已普遍将内存池(Memory Pool)从传统 slab 分配器升级为面向低延迟场景的零拷贝、NUMA-aware、硬件卸载协同型…...

高效鼠标连点器实战指南:5步配置方案提升工作效率300%

高效鼠标连点器实战指南:5步配置方案提升工作效率300% 【免费下载链接】MouseClick 🖱️ MouseClick 🖱️ 是一款功能强大的鼠标连点器和管理工具,采用 QT Widget 开发 ,具备跨平台兼容性 。软件界面美观 ,…...