Updated SM2加解密性能 (markdown)

Sun Yimin 2024-05-14 17:34:30 +08:00
parent bc12e329c5
commit f89ded0c04

@ -7,7 +7,7 @@
* 第6步是异或操作
* 第7步是SM3哈希计算
SM2加密的性能主要是由上述7步计算共同决定的关于SM2椭圆曲线计算这里不作讨论。第6步异或操作相对最简单、耗时也最少。第7步SM3哈希计算其耗时随待加密数据长度增加而增加。我们来看看性能数据
SM2加密的性能主要是由上述7步计算共同决定的关于SM2椭圆曲线计算和待加密数据无关,这里可以看作常量,不作讨论。第6步异或操作相对最简单、耗时也最少。第7步SM3哈希计算其耗时随待加密数据长度增加而增加。我们来看看性能数据
**SM2加密明文长度不超过32字节使第5-7步影响最小**
```
@ -22,7 +22,63 @@ BenchmarkLessThan32_SM2-6
**第5步KDF**
```
goos: windows
goarch: amd64
pkg: github.com/emmansun/gmsm/sm3
cpu: Intel(R) Core(TM) i5-9500 CPU @ 3.00GHz
BenchmarkKdfWithSM3
BenchmarkKdfWithSM3/zLen=32-kLen=32
BenchmarkKdfWithSM3/zLen=32-kLen=32-6
5110834 232.9 ns/op 32 B/op 1 allocs/op
BenchmarkKdfWithSM3/zLen=32-kLen=64
BenchmarkKdfWithSM3/zLen=32-kLen=64-6
2580963 463.4 ns/op 96 B/op 2 allocs/op
BenchmarkKdfWithSM3/zLen=32-kLen=128
BenchmarkKdfWithSM3/zLen=32-kLen=128-6
1305332 897.0 ns/op 224 B/op 3 allocs/op
BenchmarkKdfWithSM3/zLen=64-kLen=32
BenchmarkKdfWithSM3/zLen=64-kLen=32-6
2992752 399.6 ns/op 32 B/op 1 allocs/op
BenchmarkKdfWithSM3/zLen=64-kLen=64
BenchmarkKdfWithSM3/zLen=64-kLen=64-6
1893337 638.8 ns/op 96 B/op 2 allocs/op
BenchmarkKdfWithSM3/zLen=64-kLen=128
BenchmarkKdfWithSM3/zLen=64-kLen=128-6
1000000 1102 ns/op 224 B/op 3 allocs/op
BenchmarkKdfWithSM3/zLen=64-kLen=256
BenchmarkKdfWithSM3/zLen=64-kLen=256-6
574406 1982 ns/op 480 B/op 4 allocs/op
BenchmarkKdfWithSM3/zLen=64-kLen=512
BenchmarkKdfWithSM3/zLen=64-kLen=512-6
302526 3704 ns/op 992 B/op 5 allocs/op
BenchmarkKdfWithSM3/zLen=64-kLen=1024
BenchmarkKdfWithSM3/zLen=64-kLen=1024-6
155256 7910 ns/op 3296 B/op 7 allocs/op
BenchmarkKdfWithSM3/zLen=64-kLen=8192
BenchmarkKdfWithSM3/zLen=64-kLen=8192-6
19880 60780 ns/op 34272 B/op 13 allocs/op
```
可以看到当加密数据长度达到8K时其耗时和完整的加密不超过32字节的耗时**几乎相同**。
**第7步SM3哈希计算**
```
goos: windows
goarch: amd64
pkg: github.com/emmansun/gmsm/sm3
cpu: Intel(R) Core(TM) i5-9500 CPU @ 3.00GHz
BenchmarkHash1K
BenchmarkHash1K-6
418222 2805 ns/op 365.01 MB/s 0 B/op 0 allocs/op
BenchmarkHash8K
BenchmarkHash8K-6
57502 20781 ns/op 394.21 MB/s 0 B/op 0 allocs/op
```
可以看到当加密数据长度达到8K时其耗时几乎和达到了加密不超过32字节的耗时的**1/3**。但是目前SM3的软件实现的优化空间已经不大。
# KDF软件实现优化分析
![image](https://github.com/emmansun/gmsm/assets/7235232/e638baef-f56b-4551-a80d-afc19ada573a)
针对SM2的KDF有以下特点
* 输入的比特串Z的长度固定为64字节正好为SM3的一个处理块长度。第二个处理块也是尾块由ct开头后续由填充和长度68构成。
* klen决定了要调用哈希运算的次数(klen + v - 1) / v