仓颉语言搞国密?HiCrypto SM2签名验签+SM3哈希手把手实战教程
发布时间:2026/9/24 14:34:18 作者:尧图编辑部 阅读量:1,286

仓颉语言搞国密HiCrypto SM2签名验签SM3哈希手把手实战教程【免费下载链接】hicryptoHiCrypto是一个基于Cangjie语言开发的密码学库底层密码密码套件使用了华为公司自研的 openHiTls, 提供高效、敏捷的全场景开源密码学开发套件项目地址: https://gitcode.com/Cangjie-TPC/hicryptoHiCrypto 是一款基于仓颉Cangjie语言开发的开源密码学库底层采用华为自研的 openHiTLS 密码套件提供 SM2 国密签名验签、SM3 国密哈希、SHA 系列哈希和 HMAC 等开箱即用的接口。本教程手把手带你从零搭建环境5 分钟跑通 SM2 签名验签与 SM3 哈希计算让新手快速上手仓颉语言国密开发。为什么用 HiCrypto 做国密开发很多开发者想接触国密算法却常被复杂的 C 语言 API 劝退。HiCrypto 的设计思路很清晰把底层的复杂度封装在 ffi/keys.c 里向上只暴露简洁的仓颉对象接口。它的核心优势国密算法原生支持SM2 签名/验签/加解密、SM3 哈希一个库全搞定⚡统一接口设计所有哈希算法都实现同一个Hash接口定义见 hash.cj换个算法只改一个类名底层安全可靠基于 openHiTLS 实现符合密码学标准规范多算法覆盖MD5、SHA1~SHA512、SM3、HMAC 一应俱全源码按模块划分结构一目了然hicrypto └─src ├─crypto │ ├─hash # 哈希算法SM3 在这里 │ ├─mac # 消息认证码HMAC │ └─key # 加解密算法SM2 在这里 └─test # 测试用例最好的学习材料环境准备三步搭好开发环境动手前先准备好三样东西缺一不可安装并配置openHiTLSHiCrypto 的底层密码引擎需要头文件在/usr/local/include/hitls/下安装仓颉 SDK编译器要求 1.0.0 或更高版本见 cjpm.toml 中的cjc-version配置stdx包路径代码中要用到stdx.encoding.hex做十六进制转换然后克隆仓库并构建git clone https://gitcode.com/Cangjie-TPC/hicrypto cd hicrypto ./build_linux.sh构建脚本 build_linux.sh 做了两件事先用 gcc 编译 FFI 动态库libffiKeys.so再用cjpm build编译仓颉代码。编译完成后二进制产物位于target/release/hicrypto。 小贴士cjpm.toml 中配置了link-option -L /usr/local/lib -l hitls_crypto所以 openHiTLS 的库文件必须安装在/usr/local/lib。导入依赖两行代码接入 HiCrypto在自己的工程cjpm.toml中声明二进制依赖[target.x86_64-unknown-linux-gnu] [target.x86_64-unknown-linux-gnu.bin-dependencies] path-option [.hicrypto/target/release/hicrypto] # 替换成自己编译的路径再在源码中导入对应模块import hicrypto.crypto.hash.* // 哈希算法SM3 import hicrypto.crypto.key.* // 密钥与签名SM2 import stdx.encoding.hex.* // 十六进制编码SM3 哈希一行代码算出国密摘要SM3 是国密标准中的杂凑算法输出 32 字节256 位哈希值块大小 64 字节。HiCrypto 的 sm3.cj 封装了它对外只暴露write、finish、reset三个方法。最简洁的用法是digest便捷函数——一行算出结果let str: String helloworld let md: ArrayByte digest(SM3(), str.toArray()) println(toHexString(md)) // 输出c70c5f73da4e8b8b73478af54241469566f6497e16c053a03a0170fa00078283这个结果与官方测试用例 test_crypto_hash.cj#L183 中的期望值完全一致可以直接拿来验证你的环境是否正确。如果数据比较大比如整个文件推荐用流式写法先write分块数据最后finish()出结果中途还可以reset()复用同一实例继续算下一条数据——helloworld分两次写入的哈希与一次性写入helloworld完全相同这一点在 test_crypto_hash.cj#L75-L92 的拼接测试里得到了验证。SM2 签名验签实战给数据盖上防伪章SM2 是国密椭圆曲线算法签名验签的分工很明确私钥签名公钥验签。HiCrypto 在 sm2.cj 中用两个类实现了这套流程都继承自统一的Key接口key.cj。第一步生成密钥对并持久化var privKey SM2PrivateKey() // 生成 SM2 私钥 let pubKey SM2PublicKey(privKey) // 从私钥导出公钥 let pemStr privKey.encodeToPem() // 私钥导出为 PEM 字符串 // 验签方只需保存公钥pubKey.encodeToPem() // 下次使用时用 SM2PrivateKey.decodeFromPem(pemStr) 加载回来encodeToPem/decodeFromPem这对方法让密钥可以安全地存入文件或配置测试文件 test_crypto_sm2.cj#L64-L81 就演示了导出 PEM → 重新导入 → 继续解密的完整闭环。第二步签名与验签各一行代码let data: ArrayByte helloworld.toArray() let sig privKey.sign(data) // ① 私钥签名 let ok pubKey.verify(data, sig) // ② 公钥验签返回 Bool println(ok) // true这段逻辑与官方测试用例 test_crypto_sm2.cj#L55-L62 中的test_sm2_sig完全对应。两个值得注意的细节✍️sign内部自动使用 SM3 做摘要代码里传入了SM3_ID符合国密 SM2 签名规范你无需手动先算哈希✅verify验签失败时不会抛异常而是安静地返回false见 sm2.cj#L359-L375业务代码只需判断布尔值即可一个典型的文件完整性校验场景就是这样A 方用私钥对文件字节签名并随文件分发B 方用公钥验签true则说明文件来源可信且未被篡改。常见坑与排查指南现象原因与解决构建报链接错误openHiTLS 没装到/usr/local检查hitls_crypto库和头文件路径write failed异常对已finish()的实例继续写入会抛CryptoException需要reset()或新建实例哈希对不上确认用的是字节数组str.toArray()而非字符串本身对比 src/test/test_crypto_hash.cj 中的标准答案所有密码学异常都统一抛出自定义异常CryptoException定义见 exception.cj错误信息里带有 openHiTLS 的 errCode排查时可以直接对照。参考文档与更多探索完整 API 说明doc/api.md包含 SM3、SM2、HMAC 全部方法签名哈希用法示例test_crypto_hash.cjSM2 加解密与密钥管理test_crypto_sm2.cj版本演进记录CHANGELOG.mdSM2 其实还支持加密解密encrypt/decrypt配合 HMAC-SM3 做消息认证国密全家桶已经备齐。现在打开仓库跑一遍测试用例你的仓颉国密之旅就正式开始了 【免费下载链接】hicryptoHiCrypto是一个基于Cangjie语言开发的密码学库底层密码密码套件使用了华为公司自研的 openHiTls, 提供高效、敏捷的全场景开源密码学开发套件项目地址: https://gitcode.com/Cangjie-TPC/hicrypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考