用AES加密时的字节问题

问题描述 投票:0回答:1

我用Crypto.cipher写了一段代码,它将翻阅directoryysub-directory中的所有文件,并使用AES-ECB加密它们,现在的问题是由于某些原因我得到了这个错误。

raise ValueError("Error %d while encrypting in ECB mode" % result) ValueError: 在ECB模式下加密时出现错误3。

我试着将字节转换为base64,但还是出现了同样的问题,我想一开始可能只是某些文件以不同的方式进行了编码,但后来我看了一下列表,有些文件出现了这种异常,都是.txt,只是其中有一些数字,所以我不确定问题出在哪里。

with open(loc, 'rb') as file:
     data = file.read()
     Edata = Encrypt(data)

这是我如何加密它。

def Encrypt(msg): #AES
    pad = lambda x: x + (SIZE - len(x) % SIZE) * PADDING
    print(type(msg))
    msg = pad(msg)
    cipher = AES.new(hkey,AES.MODE_ECB)
    cipherTxt = cipher.encrypt(msg)
    return cipherTxt

编辑: python 3. 6

def Decrypt(msg): #AES
    decipher = AES.new(hkey,AES.MODE_ECB)
    plain = decipher.decrypt(msg)
    index = plain.find(b".")
    original = msg[:index]
    return original
python encryption byte aes
1个回答
1
投票

加密二进制数据与我的加密包(来自Anaconda)一起工作。你可能使用了不同的软件包 - 如果你试图加密一个字符串,我的软件包会出错。这可能只是一个稻草人,但这对我来说是可行的。

from Crypto.Cipher import AES
from Crypto.Hash import SHA256
import random

password = "temp"
hashObj = SHA256.new(password.encode("utf-8"))
hkey = hashObj.digest()

def Encrypt(msg, blocksize=16):
    """encrypt msg with padding to blocksize. Padding rule is to fill with
    NUL up to the final character which is the padding size as an 8-bit
    integer (retrieved as `msg[-1]`)
    """
    assert blocksize > 2 and blocksize < 256
    last = len(msg) % blocksize
    pad = blocksize - last
    random_pad = bytes(random.sample(range(255), pad-1))
    msg = msg + random_pad + bytes([pad])
    cipher = AES.new(hkey,AES.MODE_ECB)
    cipherTxt = cipher.encrypt(msg)
    return cipherTxt

def Decrypt(msg): #AES
    decipher = AES.new(hkey,AES.MODE_ECB)
    print('msg size', len(msg))
    plain = decipher.decrypt(msg)
    print('plain', plain)
    original = plain[:-plain[-1]]
    return original


# test binary data
sample = bytes(range(41))
print('sample', sample)
encrypted = Encrypt(sample, 16)
print('encrypted', encrypted)
print(len(sample), len(encrypted))
decrypted = Decrypt(encrypted)
print('decrypted', decrypted)
print('matched', decrypted == sample)

# test blocksize boundary
sample = bytes(range(48))
decrypted = Decrypt(Encrypt(sample))
print('on blocksize', sample==decrypted)
© www.soinside.com 2019 - 2024. All rights reserved.