【发布时间】:2014-01-18 02:43:14
【问题描述】:
我已经有一个工作程序,但唯一不能工作的是我拥有的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]
【问题讨论】:
-
它是
bytes对象。那是一种内置类型。您没有在程序中定义它,因此它使用的是内置对象。我想你的意思是plaintext。 -
你是说问题出在第 46 行吗?抱歉,我对这个有点累了,没有真正想清楚。
-
它在堆栈跟踪中显示了行和代码。
-
抱歉,第 45 行和第 46 行是我自己的调试类型的东西,所以我删除了这些并用我的实际错误替换了错误。
-
好的,我还添加了另一个在尝试修复字节时遇到的重要错误,除非我的“修复”不正确。
标签: python file encryption aes pycrypto