duanhongyi / gmssl

a python crypto for sm2/sm3/sm4
MIT License
482 stars 140 forks source link

签名验签不能和java、go等互通(已设置asn1=True) #80

Open binghc opened 1 year ago

binghc commented 1 year ago

readme里面介绍说

对接java 时验签失败可以使用

sm2_crypt = sm2.CryptSM2(
    public_key=public_key, private_key=private_key, asn1=True)

然而根本没用,不知作者是否已自测

已设置参数asn1=True,但是验签java、go等签名出来的签名数据依然是通不过,java、go是可以互通的 看了go的实现源码,里面有经过za函数,但是这个库找不到跟za有关的函数,是不是因为这个原因导致不能和java互通?

https://github.com/duanhongyi/gmssl/issues/33

另外关于sign_with_sm3和verify_with_sm3这个两个函数,自己和自己都不能通过 经过sign_with_sm3后的签名 用verify_with_sm3验签是通不过的

guangxuewu commented 10 months ago

+1

zongmingjin commented 10 months ago

+1

lvmaple commented 9 months ago

readme里面介绍说 # 对接java 时验签失败可以使用 sm2_crypt = sm2.CryptSM2( public_key=public_key, private_key=private_key, asn1=True)

然而根本没用,不知作者是否已自测

已设置参数asn1=True,但是验签java、go等签名出来的签名数据依然是通不过,java、go是可以互通的 看了go的实现源码,里面有经过za函数,但是这个库找不到跟za有关的函数,是不是因为这个原因导致不能和java互通?

33

另外关于sign_with_sm3和verify_with_sm3这个两个函数,自己和自己都不能通过 经过sign_with_sm3后的签名 用verify_with_sm3验签是通不过的

我也遇到了,然后分析了一下,大概跟作者的_sm3_z的实现有关系 在他的sm2.py中_sm3_z实现的时候使用了self.public_key,但如果你初始化CryptSM2的时候只传了private_key,没有传有效的public_key,它是不会给你生成的,这时候使用的就是空值,虽然也会生成sign,但实际上是验签不过的 以上。 至少我这是这样的,我给他加了一段如果public_key为""时通过privat_key生成public_key的代码,就可以通过它自己以及java的hutools的验签