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 向后兼容,它的行為方式與您觀察到的相同(即沒有例外 - 這不是那么好,新模塊更好)。
添加回答
舉報