python rsa加密二进制文件_用Python中的RSA加密文件
公鑰密碼通常只用于少量數(shù)據(jù)。它很慢,很難正確使用。通常的做法是使用其他方法將非對稱問題減少到由共享密鑰提供安全性的問題,然后使用公鑰加密來保護(hù)該共享密鑰。例如:要加密文件,隨機(jī)生成塊或流密碼(例如AES)的密鑰。存儲用此密碼加密的數(shù)據(jù),并將用公鑰加密的密鑰與加密的負(fù)載一起存儲。
要簽署文件,請計(jì)算加密摘要(例如SHA-256)。用私鑰簽署文件摘要并將其存儲在文件旁邊。
下面是加密的大致情況(警告,未經(jīng)測試的代碼,直接在瀏覽器中鍵入):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字節(jié)),但需要一個更好的加密庫。
請注意,一般情況下,不應(yīng)使用RSA直接加密數(shù)據(jù)。最明顯的問題是攻擊者知道公鑰,因此可以嘗試猜測明文(如果攻擊者認(rèn)為明文可能是swordfish,則攻擊者可以使用RSA公鑰加密swordfish,并將結(jié)果與RSA加密的輸出進(jìn)行比較)。如果您想將文件發(fā)送給多個收件人,另一個需要考慮的問題是,如果RSA加密步驟是確定的,那么攻擊者可以知道明文是相同的,因?yàn)槊芪氖窍嗤摹a槍@些問題的通常防御方法是使用
在這里,上述問題似乎不適用于這種情況。但是,使用無保護(hù)的RSA可能會產(chǎn)生其他弱點(diǎn)。特別是,如果公共指數(shù)非常小(這里不是PyCrypto使用65537的情況),或者您為許多不同的收件人加密相同的材料(同樣,這里可能不是這樣,因?yàn)槊總€消息都有自己的密鑰),那么simple mathematical calculation would allow the attacker to recover the RSA plaintext。為了避免這種攻擊,用RSA加密的值需要“足夠接近”RSA模,這樣加密操作實(shí)際上執(zhí)行模冪運(yùn)算。我建議的填充確保通過生成符合0xff;this is believed to be safe的最高順序字節(jié),盡管在現(xiàn)實(shí)世界中您應(yīng)該使用批準(zhǔn)的填充模式(OAEP)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python rsa加密二进制文件_用Python中的RSA加密文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel怎么在柱状图上加超链_如何让你
- 下一篇: python编_python编