guanzhi / GmSSL

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

GmSSL-v2版本sm9utl工具对签名或加密的结果追加数据,测试结果不符合预期 #1579

Open jjjighg opened 11 months ago

jjjighg commented 11 months ago

在aarch64环境下编译GmSSL-v2,测试sm9算法的功能时,发现对签名或加密的结果追加数据,仍然能验签或解密成功,这不符合预期。 测试命令如下:

# 签名
gmssl sm9utl -inkey user_priv.key -keyform der -sign -in file.txt -out sm9_signed.out
# 验签
gmssl sm9utl -paramfile master_public.key -paramform der -verify -id "Alice" -in file.txt -sigfile sm9_signed.out
# 给签名文件追加数据
cp sm9_encrypted.out sm9_signed.out.change && echo "append " >> sm9_signed.out.change
# 对追加数据的签名文件验签
gmssl sm9utl -paramfile master_public.key -paramform der -verify -id "Alice" -in file.txt -sigfile sm9_signed.out.change
结果为验签成功,不符合预期。

# 加密
gmssl sm9utl -paramfile master_public.key -paramform der -encrypt -id "Alice" -in file.txt -out sm9_encrypted.out
# 解密
gmssl sm9utl -inkey user_priv.key -keyform der -decrypt -in sm9_encrypted.out -out recover.txt
# 对追加数据的加密文件进行解密
cp sm9_encrypted.out sm9_encrypted.out.change && echo "append " >> sm9_encrypted.out.change
# 对追加数据的加密文件进行解密
gmssl sm9utl -inkey user_priv.key -keyform der -decrypt -in sm9_encrypted.out.change -out recover.txt.change
cmp file.txt recover.txt.change
结果为解密成功,不符合预期。

这个问题似乎是没有对验签或加密后的数据长度做验证?请问可以修复吗?

lpilp commented 11 months ago

你的数据追加属于非侵入式的追加,不生效的,生成的数据是asn1封装的,向后追加数据,程序正常按asn1规则取N个字符,追加的自然就被忽略了, 要是在前面或是中间加点数据,就报错了。

lpilp commented 11 months ago

这种类似的序列化都会有这样的问题,如PHP 的 serialize 序列化,也存在这个问题,向后追加照样解析,只是忽略了后面的数据

jjjighg commented 11 months ago

那么请问这个问题可以修复吗?

lpilp commented 11 months ago

那么请问这个问题可以修复吗?

我只是热心网友,你可以提PR给管理员