Tongsuo-Project / tongsuo-python-sdk

Tongsuo-Python-SDK底层使用Tongsuo密码库,旨在为Python开发者提供密码学原语和安全传输协议的支持,目前以国密算法和协议为主
Apache License 2.0
24 stars 10 forks source link

通过文本载入公钥验签异常:tongsuopy.crypto.exceptions.InvalidSignature #6

Closed ZhuoZhuoCrayon closed 1 year ago

ZhuoZhuoCrayon commented 1 year ago
def sm2_demo():
    msg = b"message"
    key = ec.generate_private_key(ec.SM2()).private_numbers().private_key()

    # 验证 key.public_key 签名 & 验签
    signature = key.sign(msg, ec.ECDSA(hashes.SM3()))
    key.public_key().verify(signature, msg, ec.ECDSA(hashes.SM3()))

    # 将公钥导出为文本
    pem_public_key_str = key.public_key().public_bytes(
        encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo
    ).decode()

    # 通过文本加载公钥
    pubkey_from_text = serialization.load_pem_public_key(pem_public_key_str.encode())

    # 验证公钥等价
    assert pubkey_from_text.public_numbers() == key.public_key().public_numbers()
    assert pubkey_from_text.public_bytes(
        encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo
    ) == key.public_key().public_bytes(
        encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo
    )
    # 验签
    pubkey_from_text.verify(signature, msg, ec.ECDSA(hashes.SM3()))

使用文本载入的公钥验签异常:

InvalidSignature                          Traceback (most recent call last)
<ipython-input-3-621b0280cfd7> in <module>
----> 1 sm2_demo()

<ipython-input-2-3f024d497b2a> in sm2_demo()
     23     )
     24     # 验签
---> 25     pubkey_from_text.verify(signature, msg, ec.ECDSA(hashes.SM3()))

/nm-bkdev-venv-36/lib/python3.6/site-packages/tongsuopy/backends/tongsuo/ec.py in verify(self, signature, data, signature_algorithm)
    361         _check_signature_algorithm(signature_algorithm)
    362         _ecdsa_sig_verify(
--> 363             self._backend, signature_algorithm.algorithm, self, signature, data
    364         )

/nm-bkdev-venv-36/lib/python3.6/site-packages/tongsuopy/backends/tongsuo/ec.py in _ecdsa_sig_verify(backend, algorithm, public_key, signature, data)
    144     if res == 0:
    145         backend._consume_errors()
--> 146         raise InvalidSignature
    147 
    148