2 回答
TA贡献1853条经验 获得超18个赞
我可以重现该问题(至少对于最新版本的 PyCryptodome,即 3.9.8)。似乎行为取决于填充类型。对于当前在发布的代码中使用的 module ,如果签名无效,PKCS1_v1_5验证不会引发 a ,而是将结果作为返回值返回。ValueError
这意味着您的verify()函数始终返回True,因为即使在签名不匹配的情况下,也不会ValueError引发 a 或计算返回值。
要解决该问题,您的verify()函数必须进行如下更改:
def verify(signed_data, exported_key):
data = signed_data[0]
signature = signed_data[1]
key = RSA.importKey(exported_key)
h = SHA256.new(pickle.dumps(data))
return PKCS1_v1_5.new(key).verify(h, signature)
可以用以下方法进行测试:
# Signing
key = RSA.generate(1024)
keyPriv = key.exportKey()
signed = sign(b'Some data', keyPriv)
# Verifying
#signed[0] = b'Some data' # Succeeds
signed[0] = b'Some other data' # Fails
keyPub = key.publickey().exportKey()
verified = verify(signed, keyPub)
print(verified)
对于 PSS 填充,即对于模块,在签名无效的情况下将引发pssa 。ValueError即,如果您通过替换切换到此填充
from Crypto.Signature import PKCS1_v1_5
和
from Crypto.Signature import pss
并且PKCS1_v1_5在pss其余代码中,verify()函数中的逻辑可以保持不变。
编辑:
正如SquareRootOfTwentyThree 的答案PKCS1_v1_5中所解释的那样,它是一个过时的模块pkcs1_15,必须使用该模块,根据此处的ValueError文档,该模块按预期会在签名无效的情况下生成。
TA贡献1810条经验 获得超5个赞
您正在导入过时的模块PKCS1_v1_5
,该模块实际上并未记录在 PyCryptodome 中。在您的代码中,您必须改为:
from Crypto.Signature import import pkcs1_15
您正在使用的旧模块(即PKCS1_v1_5
)纯粹是为了与 PyCrypto 向后兼容,它的行为方式与您观察到的相同(即没有例外 - 这不是那么好,新模块更好)。
添加回答
举报