Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SM2性能这么差? #177

Open
liyimeng opened this issue Oct 8, 2022 · 17 comments
Open

SM2性能这么差? #177

liyimeng opened this issue Oct 8, 2022 · 17 comments

Comments

@liyimeng
Copy link

liyimeng commented Oct 8, 2022

根据这个文档 https://docs.chainmaker.org.cn/v2.1.0/html/tech/密码算法引擎.html

密码库 签名 验证 加密 解密
同济库 3194 691 680 984
北大gmssl 32793 17258 7633 8902
腾讯国密 43951 26937 29283 17054

本库的性能还不到其他库的10%,有没有什么办法提高SM2性能?

@superajun-wsj
Copy link

腾讯国密有Go版本吗?

@duxin40
Copy link

duxin40 commented Nov 10, 2022

同问

@cuipeiyu
Copy link

cuipeiyu commented Dec 7, 2022

指的是这个吧 https://github.com/Tencent/TencentKonaSMSuite

2 similar comments
@cuipeiyu
Copy link

cuipeiyu commented Dec 7, 2022

指的是这个吧 https://github.com/Tencent/TencentKonaSMSuite

@cuipeiyu
Copy link

cuipeiyu commented Dec 7, 2022

指的是这个吧 https://github.com/Tencent/TencentKonaSMSuite

@aveyuan
Copy link

aveyuan commented Mar 24, 2023

是因为这个库是纯GO实现,北大是CGO,腾讯是JAVA,语言的区别?

@superajun-wsj
Copy link

存计算类的,感觉Go与C不应该这么大差距,同时也应该只比Java峰值性能差一点才正常

@aveyuan
Copy link

aveyuan commented Mar 24, 2023

存计算类的,感觉Go与C不应该这么大差距,同时也应该只比Java峰值性能差一点才正常

卧槽,我刚刚自己试了试,跑Mark。几百。这,,,,,

Encode

Running tool: C:\Program Files\Go\bin\go.exe test -benchmem -run=^$ -bench ^BenchmarkEncSm2$ learning-test/sm2

goos: windows
goarch: amd64
pkg: learning-test/sm2
cpu: AMD Ryzen 7 5700U with Radeon Graphics         
BenchmarkEncSm2-16    	     933	   1253870 ns/op	   74418 B/op	    1536 allocs/op
PASS
ok  	learning-test/sm2	1.329s

再看看Decode

Running tool: C:\Program Files\Go\bin\go.exe test -benchmem -run=^$ -bench ^BenchmarkDecSm2$ learning-test/sm2

goos: windows
goarch: amd64
pkg: learning-test/sm2
cpu: AMD Ryzen 7 5700U with Radeon Graphics         
BenchmarkDecSm2-16    	    1164	   1021186 ns/op	   65469 B/op	    1352 allocs/op
PASS
ok  	learning-test/sm2	1.319s

@aveyuan
Copy link

aveyuan commented Mar 24, 2023

我测试了对称加密,可以达到100w

goos: windows
goarch: amd64
pkg: encrypt/cecsm
cpu: AMD Ryzen 7 5700U with Radeon Graphics         
BenchmarkDecode-16    	 1000000	      1141 ns/op	     368 B/op	      11 allocs/op
PASS
ok  	encrypt/cecsm	1.198s

@johnshajiang
Copy link

根据这个文档 https://docs.chainmaker.org.cn/v2.1.0/html/tech/密码算法引擎.html

这个文档里面所说的腾讯国密库,应该是指的TencentSM,而不是TencentKonaSMSuite
TencentSM是一个C语实现的国密密码学算法库,并没有开源;TencentKonaSMSuite是纯Java实现的国密密码算法与安全协议协议的组件。

@emmansun
Copy link

emmansun commented Dec 27, 2023

关于加密软件性能,我尝试从以下几个方面解释:

  • 纯语言,这方面肯定是有差距的:譬如是编译型还是解释型、自己管理内存还是语言托管等等。
  • 算法(不考虑CPU架构),这方面差距也是有的,而且差距有可能比较大,好的算法能大大提高性能。
  • 针对CPU架构的优化,这方面差距很大。

当然性能是一方面,安全性也非常重要,实现最好是做到常量时间运行,也就是说运行性能和密钥等机密信息的长短、大小等不产生关系,以防侧信道攻击。

所以,选择密码软件,最好能进行相关方面的测试,开源是好的选择,因为你能看到实现细节、判断实现的安全性(当然需要一定的知识)。闭源软件,一个是进行针对性测试,另外一个,如有条件,购买之前最好请第三方进行独立审计,或者有“权威”机构的检测报告。

@johnshajiang
Copy link

@emmansun
请问,是否研究过Tongsuo的SM2实现?
它新近发布的8.4.0版本就对SM2有较大的性能改进。相关的PR应该是:Tongsuo-Project/Tongsuo#446

@emmansun
Copy link

@johnshajiang 没有看过。Go语言的话可以考虑使用emmansun/gmsm。

@liyimeng
Copy link
Author

@emmansun 感谢分享!emmansun/gmsm的性能是不是比这个有改进?

@emmansun
Copy link

@emmansun 感谢分享!emmansun/gmsm的性能是不是比这个有改进?

这是发布v0.24.1时跑的结果,分别是SM2和NIST P256,测试代码在https://github.com/emmansun/gmsm/blob/main/sm2/sm2_test.go

go: v1.21.1
goos: windows
goarch: amd64
pkg: github.com/emmansun/gmsm/sm2
cpu: Intel(R) Core(TM) i5-9500 CPU @ 3.00GHz
BenchmarkSign_SM2
BenchmarkSign_SM2-6
   80709	     14215 ns/op	    1544 B/op	      22 allocs/op
BenchmarkVerify_SM2
BenchmarkVerify_SM2-6
   19902	     60295 ns/op	     848 B/op	      17 allocs/op   
BenchmarkSign_P256
BenchmarkSign_P256-6
   51289	     23286 ns/op	    2440 B/op	      33 allocs/op
BenchmarkVerify_P256
BenchmarkVerify_P256-6
   17524	     67679 ns/op	     944 B/op	      20 allocs/op

你可以通过SM2性能优化(续)了解一下大概,当然有兴趣也可以直接浏览实现代码。

@MaoJianwei
Copy link

很棒的库!希望能做更多的封装,让使用更方便一些。类似tjfoc/gmsm这个库里面的sm4.SM4Cbc等全局函数,一次调用就可以完成加密,减少手工padding、创建cipher对象等重复工作:)
@emmansun

@emmansun 感谢分享!emmansun/gmsm的性能是不是比这个有改进?

这是发布v0.24.1时跑的结果,分别是SM2和NIST P256,测试代码在https://github.com/emmansun/gmsm/blob/main/sm2/sm2_test.go

go: v1.21.1
goos: windows
goarch: amd64
pkg: github.com/emmansun/gmsm/sm2
cpu: Intel(R) Core(TM) i5-9500 CPU @ 3.00GHz
BenchmarkSign_SM2
BenchmarkSign_SM2-6
   80709	     14215 ns/op	    1544 B/op	      22 allocs/op
BenchmarkVerify_SM2
BenchmarkVerify_SM2-6
   19902	     60295 ns/op	     848 B/op	      17 allocs/op   
BenchmarkSign_P256
BenchmarkSign_P256-6
   51289	     23286 ns/op	    2440 B/op	      33 allocs/op
BenchmarkVerify_P256
BenchmarkVerify_P256-6
   17524	     67679 ns/op	     944 B/op	      20 allocs/op

你可以通过SM2性能优化(续)了解一下大概,当然有兴趣也可以直接浏览实现代码。

@liyimeng
Copy link
Author

liyimeng commented Jan 2, 2024

@emmansun 再次感谢分享,已经加星!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants