2 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
我可以重現(xiàn)該問(wèn)題(至少對(duì)于最新版本的 PyCryptodome,即 3.9.8)。似乎行為取決于填充類型。對(duì)于當(dāng)前在發(fā)布的代碼中使用的 module ,如果簽名無(wú)效,PKCS1_v1_5驗(yàn)證不會(huì)引發(fā) a ,而是將結(jié)果作為返回值返回。ValueError
這意味著您的verify()函數(shù)始終返回True,因?yàn)榧词乖诤灻黄ヅ涞那闆r下,也不會(huì)ValueError引發(fā) a 或計(jì)算返回值。
要解決該問(wèn)題,您的verify()函數(shù)必須進(jìn)行如下更改:
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)
可以用以下方法進(jìn)行測(cè)試:
# 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)
對(duì)于 PSS 填充,即對(duì)于模塊,在簽名無(wú)效的情況下將引發(fā)pssa 。ValueError即,如果您通過(guò)替換切換到此填充
from Crypto.Signature import PKCS1_v1_5
和
from Crypto.Signature import pss
并且PKCS1_v1_5在pss其余代碼中,verify()函數(shù)中的邏輯可以保持不變。
編輯:
正如SquareRootOfTwentyThree 的答案PKCS1_v1_5中所解釋的那樣,它是一個(gè)過(guò)時(shí)的模塊pkcs1_15,必須使用該模塊,根據(jù)此處的ValueError文檔,該模塊按預(yù)期會(huì)在簽名無(wú)效的情況下生成。

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
您正在導(dǎo)入過(guò)時(shí)的模塊PKCS1_v1_5
,該模塊實(shí)際上并未記錄在 PyCryptodome 中。在您的代碼中,您必須改為:
from?Crypto.Signature?import?import?pkcs1_15
您正在使用的舊模塊(即PKCS1_v1_5
)純粹是為了與 PyCrypto 向后兼容,它的行為方式與您觀察到的相同(即沒(méi)有例外 - 這不是那么好,新模塊更好)。
添加回答
舉報(bào)