guanzhi / GmSSL

支持国密SM2/SM3/SM4/SM9/SSL的密码工具箱
http://gmssl.org
Apache License 2.0
5.17k stars 1.67k forks source link

[2.0版本考古求助,3.0已解决]gmssl 2.0产生带密码的私钥怎么提取未加密的私钥出来啊? #1637

Open ChuLiqiang opened 8 months ago

ChuLiqiang commented 8 months ago

2.0版本中gmssl ecparam -genkey -name sm2p256v1 | gmssl pkcs8 -topk8 -out 11000000002090000001_SIGN.key 然后我输入密码12345678产生了11000000002090000001_SIGN.key。这个Key是带密码的?gmssl怎么把1000000002090000001_SIGN.key转换成不带密码的key啊? gmssl3我知道怎么弄。但是2.0和3.0私钥之间不通用。2.0相关的参考手册有吗?

2.0版本产生的私钥密码 12345678 私钥内容

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIHsMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAinIWjoUfurSgICCAAw
DAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEEJ3530BrLtaykBLDetrkHvUEgZDs
dwstEPiHNZj9KgFSfoM99BQMXXwnmLRT4MgNR284oGPhLRk+pjnbR5XzQncBhUA5
NVgD47L81JIEnDUfbwR7DlV5Ox4/lPGeWaWqyQyklEbruMNVvb5afjVmT0D+oTwe
h9OEDSB/oxqrN7TGUqwxpKLiunrDxXSu83uCBxDf4/O+IiXCfR2zjWx/CbfVie0=
-----END ENCRYPTED PRIVATE KEY-----
lpilp commented 8 months ago

加密算法与2.0与3.0是有所不同, 2.0的 pbkdf2算法使用 sh256哈稀,采用的是aes256-cbc对称加密算法, 3.0使用是 sm3哈稀, sm4-cbc加密 所以解开后: salt: A72168E851FBAB4A , iter是 2048次,aes的向量是:9DF9DF406B2ED6B29012C37ADAE41EF5, 使用pbkdf2算法算出密钥, 用用aec256-cbc 解密

ChuLiqiang commented 8 months ago

2.0的 pbkdf2算法使用 sh256哈稀,采

用2.0的 gmssl命令行能解出未加密的私钥吗?

lpilp commented 8 months ago

2.0项目demo 没有的话,就是没有了,只能源码里抠了

emmansun commented 8 months ago

有现成工具就用现成工具,没有的话,用第三方库写几行代码。

-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBG0wawIBAQQgvGHyWej6oup0n/uv
GTINk4ccmsjDSuN1E2vPONszsD+hRANCAAQQTvMFG5uPwznbyeVWfo5Vrj9IAnUZ
Ja6BFMbS17QqQo3l+23LHNuhedQ/NVc2CkZzcZn4W+jNe8uflNIwkTz0
-----END PRIVATE KEY-----
ChuLiqiang commented 8 months ago

有现成工具就用现成工具,没有的话,用第三方库写几行代码。

-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBG0wawIBAQQgvGHyWej6oup0n/uv
GTINk4ccmsjDSuN1E2vPONszsD+hRANCAAQQTvMFG5uPwznbyeVWfo5Vrj9IAnUZ
Ja6BFMbS17QqQo3l+23LHNuhedQ/NVc2CkZzcZn4W+jNe8uflNIwkTz0
-----END PRIVATE KEY-----

老师,您能在具体说一下吗?网上我找了一些网站的例子,解析失败了。好像私钥这块的标准挺多的。导致第三方网站上面都是明文私钥不是加密后的私钥。我在GMSSL2.0源码搜过sm2p256v1这个关键字,里面没有例子。可能方式不对,这块有GMSSL的教程吗?或者您当前解析出来的私钥,是咋弄的?

emmansun commented 8 months ago

你可以参考 https://github.com/emmansun/gmsm/blob/main/pkcs8/example_test.go ,先Parse 后 Marshal。

ChuLiqiang commented 8 months ago

你可以参考 https://github.com/emmansun/gmsm/blob/main/pkcs8/example_test.go ,先Parse 后 Marshal。 image 用GO解析出来了,用gmssl不行吗?

emmansun commented 8 months ago

@lpilp 不是给你解释过了吗?https://github.com/guanzhi/GmSSL/blob/cfdcd0c0e3049ea86289f0be0b43372a69205494/src/sm2_key.c#L596

ChuLiqiang commented 8 months ago

@lpilp 不是给你解释过了吗?

https://github.com/guanzhi/GmSSL/blob/cfdcd0c0e3049ea86289f0be0b43372a69205494/src/sm2_key.c#L596

@lpilp 这位老师说的我没听太懂。因为这块理论知识比较缺乏。所以你们一看就明白的东西,我这边没听懂。不好还是很感谢两位老师的帮助。另外GO程序我刚刚试了不支持pbeWithMD5AndDES-CBC 私钥类型的解密,这块还有例子参考吗?

加密算法与2.0与3.0是有所不同, 2.0的 pbkdf2算法使用 sh256哈稀,采用的是aes256-cbc对称加密算法, 3.0使用是 sm3哈稀, sm4-cbc加密
所以解开后: salt: A72168E851FBAB4A , iter是 2048次,aes的向量是:9DF9DF406B2ED6B29012C37ADAE41EF5,
使用pbkdf2算法算出密钥, 用用aec256-cbc 解密

salt/iter/aes的向量 这三个我脑子里面是没有概念的....,我抽时间看一下相关知识。lpilp老师的话我现在理解是 image

emmansun commented 8 months ago

关于pbeWithMD5AndDES-CBC, #1635 不是已经解释了吗?你这种老旧私钥是怎么产生的?遗留系统?

ChuLiqiang commented 8 months ago

关于pbeWithMD5AndDES-CBC, #1635 不是已经解释了吗?你这种老旧私钥是怎么产生的?遗留系统?

恩,别人给的。

lpilp commented 8 months ago

如果只要一锤子买卖,直接用 openssl就可以直接解开了, sh256 + aes-cbc这是 基本是标配 2.0的这种可以直接解, 3.0的就解不开了,一开始以为你是要实时解密,就写了算法,

openssl ec -in private_key.pem -out new_private_key.der
# 输入密码

将new_private_key.der 直接解开就行了,你那例子去掉密码后是

-----BEGIN EC PRIVATE KEY-----
MHcCAQEEILxh8lno+qLqdJ/7rxkyDZOHHJrIw0rjdRNrzzjbM7A/oAoGCCqBHM9V
AYItoUQDQgAEEE7zBRubj8M528nlVn6OVa4/SAJ1GSWugRTG0te0KkKN5fttyxzb
oXnUPzVXNgpGc3GZ+FvozXvLn5TSMJE89A==
-----END EC PRIVATE KEY-----

然后这个der decode后就出来明文的么私钥了

ChuLiqiang commented 7 months ago

如果只要一锤子买卖,直接用 openssl就可以直接解开了, sh256 + aes-cbc这是 基本是标配 2.0的这种可以直接解, 3.0的就解不开了,一开始以为你是要实时解密,就写了算法,

openssl ec -in private_key.pem -out new_private_key.der
# 输入密码

将new_private_key.der 直接解开就行了,你那例子去掉密码后是

-----BEGIN EC PRIVATE KEY-----
MHcCAQEEILxh8lno+qLqdJ/7rxkyDZOHHJrIw0rjdRNrzzjbM7A/oAoGCCqBHM9V
AYItoUQDQgAEEE7zBRubj8M528nlVn6OVa4/SAJ1GSWugRTG0te0KkKN5fttyxzb
oXnUPzVXNgpGc3GZ+FvozXvLn5TSMJE89A==
-----END EC PRIVATE KEY-----

然后这个der decode后就出来明文的么私钥了

这个解析出来的私钥,好像比普通的私钥文件少个头部信息啊。

----BEGIN EC PRIVATE KEY-----
MHcCAQEEILxh8lno+qLqdJ/7rxkyDZOHHJrIw0rjdRNrzzjbM7A/oAoGCCqBHM9V
AYItoUQDQgAEEE7zBRubj8M528nlVn6OVa4/SAJ1GSWugRTG0te0KkKN5fttyxzb
oXnUPzVXNgpGc3GZ+FvozXvLn5TSMJE89A==
-----END EC PRIVATE KEY-----

少个头部信息是不是3.0是不是又不行了? image

zxc408828359 commented 3 months ago

2.0版本中gmssl ecparam -genkey -name sm2p256v1 | gmssl pkcs8 -topk8 -out 11000000002090000001_SIGN.key 然后我输入密码12345678产生了11000000002090000001_SIGN.key。这个Key是带密码的?gmssl怎么把1000000002090000001_SIGN.key转换成不带密码的key啊? gmssl3我知道怎么弄。但是2.0和3.0私钥之间不通用。2.0相关的参考手册有吗?

2.0版本产生的私钥密码 12345678 私钥内容

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIHsMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAinIWjoUfurSgICCAAw
DAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEEJ3530BrLtaykBLDetrkHvUEgZDs
dwstEPiHNZj9KgFSfoM99BQMXXwnmLRT4MgNR284oGPhLRk+pjnbR5XzQncBhUA5
NVgD47L81JIEnDUfbwR7DlV5Ox4/lPGeWaWqyQyklEbruMNVvb5afjVmT0D+oTwe
h9OEDSB/oxqrN7TGUqwxpKLiunrDxXSu83uCBxDf4/O+IiXCfR2zjWx/CbfVie0=
-----END ENCRYPTED PRIVATE KEY-----

求问3.0是怎么解出来的