SM3加密算法开源项目推荐
来自
ljgibbslf
的github项目,知乎同名,欢迎star https://github.com/ljgibbslf/SM3_core
下面是项目的README
SM3_core
国密 SM3 杂凑算法的硬件 IP,RTL 采用 Verilog 开发,测试平台使用 SystemVerilog 语言。
算法与标准
SM3 是中国的杂凑密码算法国家标准,SM3 算法与 SHA、MD5 等算法同属于杂凑算法,又称哈希算法,散列算法等。
SM3杂凑算法是我国自主开发的密码算法,并于2016年上升为国家标准。
SM3算法采用Merkle-Damgård结构,消息分组长度512比特,摘要结果长度256比特。SM3 算法包括消息填充分组,消息扩展以及消息压缩三个步骤。
整体结构与 SHA-256 算法结构接近,但增加了多种新设计技术以提高安全性。
SM3标准文本[1]
功能
- 输入任意长度的消息
- 运算完成消息的杂凑值输出
特性
- 输入消息长度按字节对齐;消息长度支持标准规定的最长消息长度:(2^64-1) 比特
- 输入与内部运算位宽可为 32/64 比特 (64 bit 特性将于 v1.0 支持)
- 单个消息块运算时钟周期为 65 (32 bit) / 33 (64 bit)
- 最大吞吐(FPGA : //TODO ASIC: //TODO)
接口
目前采用简单接口设计,将在未来版本支持 AXI 等总线接口。
输入
- 时钟与异步复位
- 消息数据
- 消息数据有效
- 消息数据末尾(表示当前数据为消息的最后一块)
- 消息数据字节有效
输出
- 消息输入就绪
- 杂凑结果
- 杂凑结果输出有效
信号 |
方向 |
位宽 |
描述 |
---|---|---|---|
clk ,rst_n |
I |
1 |
时钟与异步复位 |
msg_inpt_d |
I |
32/64 |
消息数据 |
msg_inpt_vld |
I |
1 |
消息数据有效 |
msg_inpt_lst |
I |
1 |
消息数据末尾(表示当前数据为消息的最后一块) |
msg_inpt_vld_byte |
I |
4/8 |
消息数据字节有效(一般在非对齐的消息末尾标识有效字节) |
msg_inpt_rdy |
O |
1 |
消息输入就绪 |
cmprss_otpt_res |
O |
256 |
杂凑结果输出 |
cmprss_otpt_vld |
O |
1 |
杂凑结果输出有效 |
波形示例
下图是一个例子,输入数据共 9 个字节,分为 3 个周期输入,其中前两个周期为完整的 32 bit 字,第三个周期输入字不对称,仅高字节有效,因此 msg_inpt_vld_byte 信号为 4'b1000。
实现与测试
SM3_core 虽然最初为 FPGA 平台设计,但由于其本身不包括任何 FPGA IP 与原语,因此同样适用于 ASIC 平台。
测试
SM3_core 目前提供了一个基于 Modelsim 与 Windows 10 的测试平台,以及相应的运行脚本,其中测试平台:
- 生成长度与内容随机的消息激励
- 将消息激励分别输入 C 语言参考模型(通过 DPI)与逻辑模块顶层
- C 语言参考模型修改自 GMSSL 项目
- 判断两者输出是否一致
运行测试(How to run)
运行 sim/run/run_sim.bat 脚本启动测试平台,该脚本
- 通过环境变量获取 Modelsim 路径(实际通过 License 变量:LM_LICENSE_FILE)
- 目前已经测试的 Modelsim 版本与环境:10.5 on Win10
实现
- FPGA:Virtex-7 with Vivado 18.3 //TODO
- ASIC: //TODO
未来演进
- 在 FPGA/ASIC 平台上对实现的性能进行分析
- 实际支持 64 位总线与内部运算位宽
- 支持更多的仿真工具,如 VCS
- 支持 AXI-stream 总线接口
- 提供更完善的文档支持
参考资料
[1]
SM3标准文本: http://www.gmbz.org.cn/main/viewfile/20180108023812835219.html
- 震惊了!这样的js面试题让所有人-男默女泪
- 前端知识学了却不会用,都是没走心
- var a="xx";a=a+"ss";a的值变了,但"xx"字符串并没有变
- 先行者计划--1109微课总结 | 《通过二个demo初识webPack》
- 先行者计划--1107微课 《什么是Vuex?》| 文字简版
- 脱离前端菜鸟层次的二个关键点
- 【课堂笔记】先行者 3.0版本的vueJs课程的第三次课
- ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation
- 【课堂笔记】先行者 3.0版本的vueJs课程的第二次课
- 用Python做证券指数的三种策略分析
- 明确告诉你,眼界不够,JS再好也成不了好前端
- 手把手教你整合最优雅的SSM框架
- WCF后续之旅(9):通过WCF的双向通信实现Session管理[上篇]
- 周末小贴士之“什么是语法糖”?有啥意义?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2020-09-25:rust中Point是结构体类型,【let p1=Point{x:25,y:25};let p2=p1;】...
- R语言在BRFSS数据中可视化分析探索糖尿病的影响因素
- R语言可视化探索BRFSS数据并逻辑回归Logistic回归预测中风
- R语言对BRFSS数据探索回归数据分析
- 使用R语言创建自定义桑基图Sankey图
- 在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析
- R语言中的偏最小二乘回归PLS-DA
- R语言实现偏最小二乘回归法 partial least squares (PLS)回归
- 用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类
- python爬虫进行Web抓取LDA主题语义数据分析报告
- Python使用神经网络进行简单文本分类
- 在Python中自然语言处理生成词云WordCloud
- 使用Python中的ImageAI进行对象检测
- 适用于NLP自然语言处理的Python:使用Facebook FastText库
- R语言ISLR工资数据进行多项式回归和样条回归分析