diff --git a/SM2加解密性能.md b/SM2加解密性能.md index b7182ae..7263086 100644 --- a/SM2加解密性能.md +++ b/SM2加解密性能.md @@ -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