Table of Contents
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
中国国家密码管理局商用密码实现及优化系列。
总体而言,在AMD64架构下,SM2/3的性能已经和主流NIST P256 / SHA 256相差不大了(要是AMD64也实现了SHA指令扩展,那SM3/SHA256的性能差别就会显著扩大。注:crypto/sha256: add sha-ni implementation,NI实现预计将于golang 1.21发布。SHA extensions);而SM4,由于CPU指令级别的差距,AES具有无法比拟的性能优势。
不过,Intel CPU很快(大概2025年)也会支持SM3/SM4: Intel CPU supports SM3 SM4。
各算法架构优化表:
amd64 | arm64 | ppc64x(*1) | s390x | riscv64 | loong64(*3) | |
---|---|---|---|---|---|---|
SM2 | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ |
SM3 | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ |
SM4 | ✔ | ✔ | ✔ | ✘ | ✘ | ✘ |
SM9 | ✔ | ✔ | ✔ | ✘(*2) | ✘ | ✘ |
ZUC | ✔ | ✔ | ✔ | ✘ | ✘ | ✘ |
注1:ppc64x主要指ppc64le, 因为ppc64没有test/CI环境。
注2:s390x的SM9优化基于现实需求没有实现。
注3:loong64的test/CI环境还没有Ready,且loong64和riscv64类似,几乎没有CPU feature可以利用,SIMD/Vector(LSX/LASX)目前在Golang也不支持(从Golang 1.23.x开始,正在逐步支持)。
实现策略
算法用C语言实现,其它语言使用链接库绑定实现
C语言实现的话,大部分实现都修改、扩展、剪裁自OpenSSL。好处在于OpenSSL认可度高、社区活跃、功能完善。典型的例子如:
OpenSSL本身也已经支持基本的SM2/SM3/SM4实现。
不依赖于链接库
优点在于:
- 不需要受限于依赖的链接库,使用方便;
- 易于维护;
缺点:
- 可能是重复造轮子,开发难度相对较大,密码软件不只是结果正确,其执行过程安全性非常重要;
- 纯Go语言(无汇编优化)实现的性能可能没有那么好;