【发布时间】:2019-05-10 11:14:15
【问题描述】:
我有一个程序尝试使用 aes 加密消息。当我必须加密消息并得到TypeError: Object type <class 'str'> cannot be passed to C code 时,就会出现问题。我发现如果我将它编码为 utf-8 它可以工作,但是当我尝试解密它时它并没有摆脱 b'...' 并且 base64 解密失败,使我的 iv 不是 16 个字节。每当我尝试使用 aes.decrypt(file.readline().decode("utf-8")) 解码文件的第一行时,它都会说我不能在 str 上使用解码。
from Crypto.Cipher import AES
from Crypto import Random
def pad(s):
pad = s + (16 - len(s) % 16) * chr(16 - len(s) % 16)
return str(pad)
def unpad(s):
unpad = s[:-ord(s[len(s)-1:])]
return str(unpad)
class AESCipher:
def __init__( self, key ):
self.key = key
def encrypt( self, s ):
raw = pad(s)
iv = Random.new().read( AES.block_size )
cipher = AES.new( self.key, AES.MODE_CBC, iv )
return base64.b64encode( iv + cipher.encrypt( raw.encode("utf-8") ) )
def decrypt( self, enc ):
enc = base64.b64decode(enc)
iv = enc[:16]
cipher = AES.new(self.key, AES.MODE_CBC, iv )
return unpad(cipher.decrypt( enc[16:] ))
我是加密新手,所以我真的不知道以前是否已经回答过这个问题,我只是不知道如何措辞,但我已经四处寻找了几个小时并没有找到任何事物。 谢谢你。 再次抱歉,如果措辞不当。
【问题讨论】:
-
在加密/解密数据时应始终使用字节。然后您可以解码为字符串(如果是纯文本),或 base-46 编码(如果是密文)。
b''表示一个字节字符串,它不是实际字符串的一部分,它只是字符串的表示形式。如果您解码为字符串 (b''.decode()),您可以“摆脱它”。请记住,'s'.encode()-> 字节,b's'.decode()-> 字符串。 -
pad和unpad定义在哪里?始终在示例代码中包含非标准(或非显而易见)函数的定义。 -
def pad(s): pad = s + (16 - len(s) % 16) * chr(16 - len(s) % 16) return str(pad) def unpad(s): unpad = s[:-ord(s[len(s)-1:])] return str(unpad) -
@Tomalak 有pad和unpad功能。
-
@t.m.adam 问题是当我从文件中读取时,它的行为就像是“b's”的文字字符串,并且不允许我对其进行解码。
标签: python-3.x encryption python-unicode unicode-string