类型错误:使用PyCrypto.AES

问题描述:

我试图做一些尝试在加密和使用PyCrypto.AES解密,当我尝试解密它时,“STR”不支持缓冲界面给我TypeError: 'str' does not support the buffer interface类型错误:使用PyCrypto.AES

我找到了一些解决方案,其中我必须编码或使用字符串,但我不知道如何使用它。

AESModule.py

from Crypto.Cipher import AES 
#base64 is used for encoding. dont confuse encoding with encryption# 
#encryption is used for disguising data 
#encoding is used for putting data in a specific format 
import base64 
# os is for urandom, which is an accepted producer of randomness that 
# is suitable for cryptology. 
import os 

def encryption(privateInfo,secret,BLOCK_SIZE): 
    #32 bytes = 256 bits 
    #16 = 128 bits 
    # the block size for cipher obj, can be 16 24 or 32. 16 matches 128 bit. 
    # the character used for padding 
    # used to ensure that your value is always a multiple of BLOCK_SIZE 
    PADDING = '{' 
    # function to pad the functions. Lambda 
    # is used for abstraction of functions. 
    # basically, its a function, and you define it, followed by the param 
    # followed by a colon, 
    # ex = lambda x: x+5 
    pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 
    # encrypt with AES, encode with base64 
    EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
    # generate a randomized secret key with urandom 
    #secret = os.urandom(BLOCK_SIZE) 
    print('Encryption key:',secret) 
    # creates the cipher obj using the key 
    cipher = AES.new(secret) 
    # encodes you private info! 
    encoded = EncodeAES(cipher, privateInfo) 
    print('Encrypted string:', encoded) 
    return(encoded) 

def decryption(encryptedString,secret): 
    PADDING = '{' 
    DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 
    #Key is FROM the printout of 'secret' in encryption 
    #below is the encryption. 
    encryption = encryptedString 
    cipher = AES.new(secret) 
    decoded = DecodeAES(cipher, encryption) 
    print(decoded) 

test.py

import AESModule 
import base64 
import os 

BLOCK_SIZE = 16 
key = os.urandom(BLOCK_SIZE) 
c = AESRun2.encryption('password',key,BLOCK_SIZE) 
AESRun2.decryption(c,key) 

字符串(str)是文本。加密并不在文字处理,它涉及以字节为单位(bytes)。

在实践中插入.encode.decode调用必要在两者之间转换。我推荐使用UTF-8编码。

在你的情况,因为您已经编码以及密文作为碱-64这是另外一个字节/文本转换解码,只需要进行编码和解码的明文。路过的时候它变成了加密的功能与.encode("utf-8")编码您的字符串,并得到它的解密函数时最终结果与.decode("utf-8")解码。

如果您正在阅读示例或教程,请确保它们适用于Python 3.在Python 2中str是一个字节字符串,将它用于文本和字节是很常见的,这非常容易混淆。在Python 3中,他们修复了它。

+0

什么.encode和 '.decode' 到底是什么? – user2415415

+0

@userrandomnumbers:已编辑。 –