python aes加解密_Python PyCrypto使用AES加密/解密文本文件

I already have a working program, but the only thing that doesn't work is the decrypt_file() function I have. I can still copy the encrypted text from the file and put it in my decrypt() function and have it work, but when I try to use my supposed-to-be handy decrypt_file() function it throws an error. Now I know 99.999% sure that my encrypt() and decrypt() functions are fine, but there is something with the bytes and strings conversion when I read and encode the text file that throws an error; I just can't find the hangup. Please help!

My Program:

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)

The text file I encrypted:

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

My error when attempting decrypt_file:

Traceback (most recent call last):

File "C:\Python33\testing\test\crypto.py", line 56, in

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]

When I replace line 45 with: plaintext += ((str(bytes([x])))) * x, this is the error I get:

Traceback (most recent call last):

File "C:\Python33\testing\test\crypto.py", line 56, in

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]

解决方案

I took a closer look at your code, and saw that there were several problems with it. First one is that the crypto functions with with bytes, not text. So it's better to just keep the data as a byte string. This is done simply by putting a 'b' character in the mode. This way you can get rid of all the encoding and bytes conversion you were trying to do.

I rewrote the whole code also using newer Python idioms. Here it is.

#!/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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值