簡體   English   中英

如何在 python 上使用 RSA 私鑰和 SHA256 進行解密

[英]How to use decrypt with RSA private key and SHA256 on python

我正在為學校學習使用公鑰和私鑰編碼來加密和解密文件。

我使用此代碼對消息進行編碼。 (產生公鑰≠不是私鑰錯誤)

from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA



def signing():
    #open file = message als binary
    message = open('C:/Users/Gebruiker/Desktop/message.txt', "rb").read()
    #open public key -> key     
    key = RSA.import_key(open('C:/Users/Gebruiker/Desktop/public.pem').read())
    #message becomes a hash
    h = SHA256.new(message)  
    #f = open file as write binary
    f = open('C:/Users/Gebruiker/Desktop/message.signature', 'wb')
    # sign hash message with private key  
    signature = pkcs1_15.new(key).sign(h) 
    #write signed hash to file 
    f.write(signature)
    f.close()

但現在我正在嘗試解碼這條消息,我發現所有這些人都以不同的方式進行解碼,並使用不同類型的編碼和加密。 而且我找不到明確的答案。

我現在擁有的是這個

首先,我必須閱讀消息

def decrypt():
    f = open('C:/Users/Gebruiker/Desktop/message.signature', 'rb').read()

然后我打開我的私鑰

    key = RSA.import_key(open('C:/Users/Gebruiker/Desktop/private.pem').read())

因為我用二進制讀寫我必須把它轉回 hash

    h = SHA256.new(f)

然后我必須使用我的私鑰解密 hash。???

相反,我看到很多人使用這樣的東西。

    h = pkcs1_15.new(key).sign(h)  # sign hash message with private key

我不明白。 你應該解碼它吧? 不要再簽了。 這部分對我來說毫無意義。

現在我有2個問題。

  1. 我收到一個編碼錯誤,說我的公鑰不是私鑰。 這有點像公鑰加密的重點。 所以只有私鑰可以解密? 為什么我會收到錯誤消息?
  2. 我不知道如何繼續解密我的消息

有人可以幫我嗎?

非常感謝!

你的問題有混淆。 RSA 的簽名生成需要使用private key的值進行模冪運算,而不是 public key。 模冪運算也用於使用公鑰進行加密 但是,盡管使用了相同的數學公式——至少在表面上——並不意味着簽名生成是用私鑰加密的,因為這樣的事情不存在 當前的 PKCS#1 標准 go 無法解釋這一事實,盡管早期的PKCS#1 標准使用 RSA 加密來識別簽名生成。

您要做的是驗證消息。 那是您期望的 function 而不是sign 驗證由受信任的公鑰執行,而不是由私鑰執行。 您不是在嘗試解碼消息,而是在嘗試驗證消息的字節確實由與受信任的公鑰屬於同一密鑰對的私鑰簽名。 通常,消息不會被恢復,甚至不會部分恢復。 PKCS#1 被稱為帶有附錄的簽名生成,它與其他稱為簽名生成給出消息恢復的方案形成對比。 附錄是簽名值,它需要附加(包含在)消息中才能使用。

實際上,您至少可以通過消息恢復 hash 這一事實特定於某些方案,例如 PKCS#1 簽名生成(在標准中正式稱為RSASSA-PKCS1-v1_5 )。 同標准中的PSS等其他方案甚至可能無法恢復hash。 只要驗證(可以在給定數據和散列的情況下進行)可以成功或失敗,就可以了。 換句話說,驗證至少應該導致 boolean 真/假,但不需要生成任何其他信息。

或者,在簡化的偽代碼中:

ciphertext = encrypt(publicKey, plaintext)
(recovered) plaintext = decrypt(privateKey, ciphertext)

signature = sign(privateKey, data)
verificationResult = verify(publicKey, data, signature)

其中數據哈希算法是簽名生成和驗證算法的配置參數 如果您想包含它,您可以例如將其包含為初始參數:

signature = sign(SHA256alg, privateKey, data)
verificationResult = verify(SHA256alg, publicKey, data, signature)

最后,您在談論“解碼”。 您對使用編碼方案編碼的消息進行解碼。 編碼/解碼不假定密鑰的存在。 我們談論的是加密/解密和簽名生成/驗證。 編碼的示例是將二進制轉換為文本的十六進制/base 64。 UTF-8 等字符編碼是將文本轉換為二進制。

約定是使用接收到的公共 RSA 密鑰進行加密,以便只有相應私鑰的持有者才能解密消息。

同樣按照慣例,您將使用您的私有 RSA 密鑰來創建一個簽名,其他擁有相應公鑰的人都可以驗證該簽名。

原則上,您可以使用公鑰來創建簽名,但這將是密鑰的錯誤用例,並且通常在實現 RSA 的庫中被阻止。 在您的情況下,當您嘗試在sign(..)調用中使用公鑰時,您會收到"public key ≠ not private key error"

簽名時,您不使用完整消息作為RSA的輸入,而是計算 hash(您使用 SHA256)。 這個 hash 不需要在簽名驗證中“解密”,而是在您想要驗證的原始消息上重新計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM