gpt4 book ai didi

Python PyCrypto 使用 AES 加密/解密文本文件

转载 作者:太空狗 更新时间:2023-10-29 17:53:14 28 4
gpt4 key购买 nike

我已经有了一个可以工作的程序,但唯一不能工作的是我拥有的 decrypt_file() 函数。我仍然可以从文件中复制加密文本并将其放入我的 decrypt() 函数中并让它工作,但是当我尝试使用我认为方便的 decrypt_file() 函数它抛出一个错误。现在我知道 99.999% 确定我的 encrypt()decrypt() 函数没问题,但是当我读取和编码文本时,字节和字符串转换有些问题抛出错误的文件;我只是找不到挂断电话。请帮忙!

我的程序:

from Crypto import Random
from Crypto.Cipher import AES

def encrypt(message, key=None, key_size=256):
def pad(s):
x = AES.block_size - len(s) % AES.block_size
return s + ((bytes([x])) * x)

padded_message = pad(message)

if key is None:
key = Random.new().read(key_size // 8)

iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CBC, iv)

return iv + cipher.encrypt(padded_message)

def decrypt(ciphertext, key):
unpad = lambda s: s[:-s[-1]]
iv = ciphertext[:AES.block_size]
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = unpad(cipher.decrypt(ciphertext))[AES.block_size:]

return plaintext

def encrypt_file(file_name, key):
f = open(file_name, 'r')
plaintext = f.read()
plaintext = plaintext.encode('utf-8')
enc = encrypt(plaintext, key)
f.close()
f = open(file_name, 'w')
f.write(str(enc))
f.close()

def decrypt_file(file_name, key):
def pad(s):
x = AES.block_size - len(s) % AES.block_size
return s + ((str(bytes([x]))) * x)

f = open(file_name, 'r')
plaintext = f.read()
x = AES.block_size - len(plaintext) % AES.block_size
plaintext += ((bytes([x]))) * x
dec = decrypt(plaintext, key)
f.close()
f = open(file_name, 'w')
f.write(str(dec))
f.close()



key = b'\xbf\xc0\x85)\x10nc\x94\x02)j\xdf\xcb\xc4\x94\x9d(\x9e[EX\xc8\xd5\xbfI{\xa2$\x05(\xd5\x18'

encrypt_file('to_enc.txt', key)

我加密的文本文件:

b';c\xb0\xe6Wv5!\xa3\xdd\xf0\xb1\xfd2\x90B\x10\xdf\x00\x82\x83\x9d\xbc2\x91\xa7i M\x13\xdc\xa7'

尝试decrypt_file时我的错误:

    Traceback (most recent call last):
File "C:\Python33\testing\test\crypto.py", line 56, in <module>
decrypt_file('to_enc.txt', key)
File "C:\Python33\testing\test\crypto.py", line 45, in decrypt_file
plaintext += ((bytes([x]))) * x
TypeError: Can't convert 'bytes' object to str implicitly
[Finished in 1.5s]

当我将第 45 行替换为:plaintext += ((str(bytes([x])))) * x 时,这是我得到的错误:

Traceback (most recent call last):
File "C:\Python33\testing\test\crypto.py", line 56, in <module>
decrypt_file('to_enc.txt', key)
File "C:\Python33\testing\test\crypto.py", line 46, in decrypt_file
dec = decrypt(plaintext, key)
File "C:\Python33\testing\test\crypto.py", line 23, in decrypt
plaintext = unpad(cipher.decrypt(ciphertext))[AES.block_size:]
File "C:\Python33\lib\site-packages\Crypto\Cipher\blockalgo.py", line 295, in decrypt
return self._cipher.decrypt(ciphertext)
ValueError: Input strings must be a multiple of 16 in length
[Finished in 1.4s with exit code 1]

最佳答案

我仔细查看了您的代码,发现其中存在多个问题。第一个是加密函数使用字节,而不是文本。所以最好只将数据保存为字节字符串。这只需在模式中放置一个“b”字符即可完成。这样你就可以摆脱你试图做的所有编码和字节转换。

我还使用更新的 Python 习语重写了整个代码。在这里。

#!/usr/bin/python3

from Crypto import Random
from Crypto.Cipher import AES

def pad(s):
return s + b"\0" * (AES.block_size - len(s) % AES.block_size)

def encrypt(message, key, key_size=256):
message = pad(message)
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CBC, iv)
return iv + cipher.encrypt(message)

def decrypt(ciphertext, key):
iv = ciphertext[:AES.block_size]
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(ciphertext[AES.block_size:])
return plaintext.rstrip(b"\0")

def encrypt_file(file_name, key):
with open(file_name, 'rb') as fo:
plaintext = fo.read()
enc = encrypt(plaintext, key)
with open(file_name + ".enc", 'wb') as fo:
fo.write(enc)

def decrypt_file(file_name, key):
with open(file_name, 'rb') as fo:
ciphertext = fo.read()
dec = decrypt(ciphertext, key)
with open(file_name[:-4], 'wb') as fo:
fo.write(dec)


key = b'\xbf\xc0\x85)\x10nc\x94\x02)j\xdf\xcb\xc4\x94\x9d(\x9e[EX\xc8\xd5\xbfI{\xa2$\x05(\xd5\x18'

encrypt_file('to_enc.txt', key)
#decrypt_file('to_enc.txt.enc', key)

关于Python PyCrypto 使用 AES 加密/解密文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20852664/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com