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密钥对封装格式,概率性无法解密 #1636

Closed
huiyuexu opened this issue Mar 5, 2024 · 4 comments
Closed

SM2密钥对封装格式,概率性无法解密 #1636

huiyuexu opened this issue Mar 5, 2024 · 4 comments

Comments

@huiyuexu
Copy link

huiyuexu commented Mar 5, 2024

背景:《GM/T 0009-2012 SM2密码算法使用规范》定义了SM2密钥对封装格式,其中私钥密文Sm2EncryptedPrivateK字段是BIT STRING格式的。

存在问题:按照DER编码格式BIT STRING数据的末尾是不能包含全零的字节的,但是实际上Sm2EncryptedPrivateK字段使用SM4-ECB加密,有一定概率出现末尾字节为0x00的情况,导致丢失了一个字节,解密时会失败。

可选解决方案
1、修复方案一,不按照DER规则,保留末尾的全0字节,需要确认国密数据ASN1编码,是否应该遵循DER编码规则。
2、修复方案二,在解密时,如果密文不满足16字节整数倍则在尾部补0。(规避方式)
3、修复方案三,修改标准,Sm2EncryptedPrivateK字段修改为OCT STRING格式。(几乎不可行)

求助点:
如上解决方案建议选用哪个?

@huiyuexu
Copy link
Author

huiyuexu commented Mar 5, 2024

@guanzhi

@emmansun
Copy link

emmansun commented Mar 5, 2024

其实不存在你说的问题,参考ITU-T X.690/ITU-T X.680:
image
image

对于非NamedBitList,DER编码不会remove尾部的0 bits的。

你也可以参考:https://www.oss.com/asn1/resources/asn1-faq.html#named-bit-list-per
image

@lpilp
Copy link

lpilp commented Mar 6, 2024

是否是对问题的定位的问题,按你说的会少了00的问题,一般是非对称加密 如果使用asn1(c1x,c1y, c3,c2)的时候,解开后,会有小概率c1x或是c1y 的长度不够(asn1编码的时候会去掉原有前面的00),拼接为 c1c3c2的时候,就会出错,这时在解开后,长度不够就得把 \0x补上

@huiyuexu
Copy link
Author

huiyuexu commented Mar 27, 2024

@emmansun 你说的没错,非NamedBitList,DER编码不会remove尾部的0 bits的,只是很多编码器默认是会remve尾部0(比如openssl的编码器)。

对于openssl,可以参考https://github.com/openssl/openssl/blob/1967539e212c17139dc810096da987c8100b1ba2/crypto/asn1/asn1_lib.c#L251 设置,不去除尾部的 0x00。

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

3 participants