python rsa加密二进制文件_用Python中的RSA加密文件
公鑰密碼通常只用于少量數據。它很慢,很難正確使用。通常的做法是使用其他方法將非對稱問題減少到由共享密鑰提供安全性的問題,然后使用公鑰加密來保護該共享密鑰。例如:要加密文件,隨機生成塊或流密碼(例如AES)的密鑰。存儲用此密碼加密的數據,并將用公鑰加密的密鑰與加密的負載一起存儲。
要簽署文件,請計算加密摘要(例如SHA-256)。用私鑰簽署文件摘要并將其存儲在文件旁邊。
下面是加密的大致情況(警告,未經測試的代碼,直接在瀏覽器中鍵入):import os
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
import Crypto.Util.number
def encrypt_file(rsa, input, output):
# Generate secret key
secret_key = os.urandom(16)
# Padding (see explanations below)
plaintext_length = (Crypto.Util.number.size(rsa.n) - 2) / 8
padding = '\xff' + os.urandom(16)
padding += '\0' * (plaintext_length - len(padding) - len(secret_key))
# Encrypt the secret key with RSA
encrypted_secret_key = rsa.encrypt(padding + secret_key, None)
# Write out the encrypted secret key, preceded by a length indication
output.write(str(len(encrypted_secret_key)) + '\n')
output.write(encrypted_secret_key)
# Encrypt the file (see below regarding iv)
iv = '\x00' * 16
aes_engine = AES.new(secret_key, AES.MODE_CBC, iv)
output.write(aes_engine.encrypt(input.read()))
iv是CBCmode of operation的一個
分組密碼的API在PEP 272中描述。不幸的是,它只支持一次加密。對于大型文件,最好逐塊加密;一次只加密一個塊(AES為16字節),但需要一個更好的加密庫。
請注意,一般情況下,不應使用RSA直接加密數據。最明顯的問題是攻擊者知道公鑰,因此可以嘗試猜測明文(如果攻擊者認為明文可能是swordfish,則攻擊者可以使用RSA公鑰加密swordfish,并將結果與RSA加密的輸出進行比較)。如果您想將文件發送給多個收件人,另一個需要考慮的問題是,如果RSA加密步驟是確定的,那么攻擊者可以知道明文是相同的,因為密文是相同的。針對這些問題的通常防御方法是使用
在這里,上述問題似乎不適用于這種情況。但是,使用無保護的RSA可能會產生其他弱點。特別是,如果公共指數非常小(這里不是PyCrypto使用65537的情況),或者您為許多不同的收件人加密相同的材料(同樣,這里可能不是這樣,因為每個消息都有自己的密鑰),那么simple mathematical calculation would allow the attacker to recover the RSA plaintext。為了避免這種攻擊,用RSA加密的值需要“足夠接近”RSA模,這樣加密操作實際上執行模冪運算。我建議的填充確保通過生成符合0xff;this is believed to be safe的最高順序字節,盡管在現實世界中您應該使用批準的填充模式(OAEP)。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python rsa加密二进制文件_用Python中的RSA加密文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel怎么在柱状图上加超链_如何让你
- 下一篇: python编_python编