亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

RSA 簽名數據驗證不起作用 PyCryptodome

RSA 簽名數據驗證不起作用 PyCryptodome

qq_遁去的一_1 2023-07-05 15:27:55
很抱歉這個非常具體的問題,但我真的要瘋了。我正在嘗試制作一個模塊,以便在需要簽名或驗證簽名時簡單地導入,但遇到了問題,無論我輸入簽名數據還是其他任何內容,驗證器都會返回 true,代碼如下:RSA_Handler.pyfrom Crypto.PublicKey import RSAfrom Crypto.Hash import SHA256from Crypto.Signature import PKCS1_v1_5import pickledef sign(data, exported_key):    key = RSA.importKey(exported_key)    signed_data = []    signed_data.append(data)    signed_data.append(PKCS1_v1_5.new(key).sign(SHA256.new(pickle.dumps(data))))    return signed_datadef verify(signed_data, exported_key):    data = signed_data[0]    signature = signed_data[1]    key = RSA.importKey(exported_key)    h = SHA256.new(pickle.dumps(data))    try:        PKCS1_v1_5.new(key).verify(h, signature)        return True    except(ValueError, TypeError):        return Falsetest01.pyfrom RSA_Handler import *import pickleimport oswith open("keys.txt", "rb") as rb:    keys = rb.read()signed = sign("hello", keys)trueorfalse = verify(["this will return"," true whatever I enter"], keys)print(trueorfalse)
查看完整描述

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文檔,該模塊按預期會在簽名無效的情況下生成。


查看完整回答
反對 回復 2023-07-05
?
森欄

TA貢獻1810條經驗 獲得超5個贊

您正在導入過時的模塊PKCS1_v1_5,該模塊實際上并未記錄在 PyCryptodome 中。在您的代碼中,您必須改為:

from?Crypto.Signature?import?import?pkcs1_15

您正在使用的舊模塊(即PKCS1_v1_5)純粹是為了與 PyCrypto 向后兼容,它的行為方式與您觀察到的相同(即沒有例外 - 這不是那么好,新模塊更好)。


查看完整回答
反對 回復 2023-07-05
  • 2 回答
  • 0 關注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號