在python中使用lambda时出现属性错误

时间:2015-12-23 08:37:15

标签: python encryption lambda

好的,所以这是我的代码到目前为止:

import os
import time
import random
import Crypto
from Crypto.PublicKey import RSA
from Crypto import Random
from Crypto.Cipher import AES
import base64

key = 'MIICWwIBAAKBgQDN'
print('do you have a encrypted string in a file?')
fileexist = input('if so then input 1:')
if fileexist == 1:
    filename = raw_input('please input path to file:')
    file = open(filename,'r')
    encoded = file.read()
    type = type(encoded)
else:
    encoded = raw_input('please enter encrypted text')
encoded = str(encoded)
BLOCK_SIZE = 16
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
decoded = DecodeAES(key, encoded)
print(decoded)

我继续在第24行上设置属性错误,我的确切错误消息如下所示

AttributeError: 'str' object has no attribute 'decrpt'

我正在尝试使用AES解密邮件。我的加密器使用几乎完全相同的语法工作得很好。我不完全理解错误的原因。我知道这是可能的,我已经看到使用这种语法的其他帖子。

2 个答案:

答案 0 :(得分:1)

预留拼写问题,在您链接的代码中,DecodeAES的第一个参数是使用AES.AESCipher创建的AES.new对象:

# create a cipher object using the random secret
cipher = AES.new(secret)

在您自己的代码中,您传递的字符串key没有decrypt方法。

而且FWIW这与被定义为lambda的函数无关 - 函数版本的行为方式完全相同:

def DecodeAES(c, e): 
    return c.decrypt(base64.b64decode(e)).rstrip(PADDING)


DecodeAES("foo", "bar")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in DecodeAES
AttributeError: 'str' object has no attribute 'decrypt'

答案 1 :(得分:1)

首先需要创建一个AES对象来传递DecodeAES。

使用

进行
key = 'MIICWwIBAAKBgQDN'
cipher = AES.new(key)

现在,不是在DecodeAES上调用key,而是在我们使用cipher创建的key对象上调用它:

decoded = DecodeAES(cipher, encoded)

这应该可以使您的代码正常工作。