# rust_sm9 **Repository Path**: kingflag-gq/rust_sm9 ## Basic Information - **Project Name**: rust_sm9 - **Description**: 基于rust语言的国密SM9实现 - **Primary Language**: Rust - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-10-21 - **Last Updated**: 2026-01-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: sm9 ## README # rust_sm9 ## 简介: 利用rust语言实现国密sm9算法中的部分算法,包括数字签名算法、密钥封装机制和公钥加解密算法。 #### SM9: SM9是中华人民共和国政府采用的一种标识密码标准,由国家密码管理局于2016年3月28日发布,相关标准为“GM/T 0044-2016 SM9标识密码算法”。其利用椭圆曲线对实现的基于标识的数字签名算法、密钥交换协议、密钥封装机制和公钥加密与解密算法,包括数字签名生成算法和验证算法。 #### RUST: Rust是一种现代的、强类型的、系统级编程语言。它被设计用于编写高性能、并发、安全的系统,并且可以避免常见的内存安全问题,如空指针和数据竞争。其特点包括:零成本抽象、无运行时开销、内存安全、并发安全、线程安全、高性能等。 ## 整体框架 ![输入图片说明](2023-10-21%20231634.png) ## 运行结果 #### 生成加解密密钥 ![输入图片说明](%E5%AF%86%E9%92%A5%E7%94%9F%E6%88%90.png) #### 加密明文 ![输入图片说明](%E5%8A%A0%E5%AF%86%E6%98%8E%E6%96%87.png) #### 解密密文 ![输入图片说明](%E8%A7%A3%E5%AF%86%E5%AF%86%E6%96%87.png) #### 生成签名密钥 ![输入图片说明](%E7%AD%BE%E5%90%8D%E5%AF%86%E9%92%A5%E7%94%9F%E6%88%90.png) #### 生成签名 ![输入图片说明](%E7%94%9F%E6%88%90%E7%AD%BE%E5%90%8D.png) #### 验证签名 ![输入图片说明](%E7%AD%BE%E5%90%8D%E9%AA%8C%E8%AF%81.png) ## 结构体说明 `pub struct Gfp(pub[u64;8])` //利用元组结构体来表示与内元素 Ex:`SM9_TWO: Gfp = Gfp([2,0,0,0,0,0,0,0]);` `pub struct Gfp2{ pub x:Gfp, pub y:Gfp, }` //由两个域内元素构成二次扩域,同理四次扩域为两个二次扩域元素表示,十二次扩域由3个四次扩域元素构成 `pub struct SM9_POINT { pub x:Gfp, pub y:Gfp, pub z:Gfp, }` //椭圆曲线上的点,以Jacobian加重射影坐标表示,由三个Gfp构成 `pub struct SM9_TWIST_POINT { pub x:Gfp2, pub y:Gfp2, pub z:Gfp2, }` //扭曲线上的点,以Jacobian加重射影坐标表示,由三个Gfp2构成 `pub struct SM9_ENC_MASTER_KEY{ pub Ppube: SM9_POINT, pub ke: Gfp, }` //加密主密钥,由加密主公钥Ppube和主私钥ke构成 `pub struct SM9_ENC_KEY{ pub Ppube: SM9_POINT, pub de: SM9_TWIST_POINT, }` //解密密钥,由加密主公钥Ppube和用户私钥de构成 `pub struct SM9_SIGN_MASTER_KEY{ Ppubs: SM9_TWIST_POINT, ks: Gfp, }` //签名主密钥,由签名主公钥Ppubs和签名主私钥ks构成 `pub struct SM9_SIGN_KEY{ Ppubs: SM9_TWIST_POINT, ds: SM9_POINT, } ` //验证密钥,由签名主公钥Ppubs和用户签名私钥ds构成 ## 使用说明 1. 代码只实现了SM9算法,并不适合用实际应用。 2. 由于代码已在作者电脑上编译完成,可以直接双击exe文件运行。 3. 本项目依赖于北航KNOC LAB和Cryptape Technology LLC合作开发的中国密码算法标准的开源纯rust库 libsm,想要重新编译或者对代码进行修改需要自行下载libsm,并将其地址添加到Cargo.toml中。对于其他所依赖的库,编译时主机联网可自动下载。 4. 程序运行后可以根据需要选择相应功能。不过请注意在生成用户密钥这部分,由于生成的用户私钥根据sm9算法不会让用户得到,并且程序不会将其保存在本地,因此在生成密钥后程序不能被关闭,否则加解密时或者签名及验证时会提示不存在该用户的私钥,此时需要重新生成用户新的密钥。 5. 由于加解密算法流程中包含了密钥封装机制,因此程序并未单独展示密钥封装,如需要单独使用密钥封装,请自行对代码进行修改。 6. 代码中所有的需要使用随机数的部分都已配置了随机数发生器,因此利用参考文档中的数据进行测试时结果会和文档不一样。若想要得到和文档中相同的结果,请自行将产生随机数部分代码注释,并添加参考文档中的固定数据。 7. 若是输入完生成的密钥、密文、签名等后出现闪退,则应是输入的密钥、密文、签名等格式不对,触发了panic ## 参考文档: 《GMT 0044-2016 SM9 标识密码算法》1-5 ## 参考项目 GmSSL:北京大学自主开发的国产商用密码开源库,实现了对国密算法、标准和安全通信协议的全面功能覆盖。 ## 说明 由于代码是作者自学rust以及sm9三个月实现的,因此实现过程中可能会出现一些未知的错误。