NameError при вызове модуля, объявление значений по умолчанию в функции класса

Я пытаюсь понять шифрование с открытым ключом, поэтому я написал этот небольшой модуль, используя PyCryptodome и модуль RSA/PKCS1_OAEP на Python 3, чтобы помочь мне в этом. Однако я продолжаю получать сообщение об ошибке:

NameError: имя «asenc» не определено

Это вопрос из двух частей:

  1. В автономном коде (вне класса) код arg = default_val будет работать, но я почти уверен, что этот код вызовет ошибку (при условии, что я решу вопрос № 2). Я также знаю, что не могу использовать self.default_val, так как для этого сначала нужно создать объект. Как назначить значение по умолчанию (в данном случае закрытый/открытый ключ объекта?)

  2. Что касается сообщения об ошибке, vgrep показывает, что набор был объявлен до его вызова, но я все равно получаю NameError. Может кто-нибудь, пожалуйста, взгляните и дайте мне знать, что я делаю неправильно?

Модули: (Разбивая на части, поскольку SO продолжает смешивать код)

from passlib.context import CryptContext
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto import Random
from Crypto.Random import get_random_bytes

Класс:

class statEnc:
    pubcipher = None
    privcipher = None
    pubkeystr = None
    privkeystr = None
    sessionkey = None

    def __init__(self, pubkeystr = None, privkeystr = None, sessionkey = None):
        self.pubkeystr = pubkeystr
        self.privkeystr = privkeystr
        self.sessionkey = sessionkey
        if pubkeystr == None or privkeystr == None:  #if blank, generate keys
            self.random_generator = Random.new().read
            self.keys = RSA.generate(1024, self.random_generator)
            self.pubkey = self.keys.publickey()
            self.pubkeystr = self.pubkey.exportKey(format='PEM',
                                            passphrase=None,
                                            pkcs=1)
            self.pubcipher = PKCS1_OAEP.new(self.pubkey)
            self.privcipher = PKCS1_OAEP.new(self.keys)
            self.privkeystr = self.keys.exportKey(format='PEM',
                                                passphrase=None,
                                                pkcs=1)
            self.privkey = self.keys.exportKey()
        else:  #import the keys
            self.pubkey = RSA.importKey(pubkeystr)
            self.pubcipher = PKCS1_OAEP.new(pubkey)
            self.privkey = RSA.importKey(privkeystr)
            self.pubcipher = PKCS1_OAEP.new(privkey)
            if sessionkey == None:
                sessionkey = get_random_bytes(16)
            else:
                self.sessionkey = sessionkey

    def encrypt_val(self, session_key, cipher = pubcipher):
        # a little ditty to hep encrypt the AES session key
        try:
            session_key = session_key.encode('utf8')
        except:
            pass
        ciphertext = cipher.encrypt(session_key)
        return ciphertext


    def decrypt_val(self, ciphertext, cipher = privcipher):
        # a little ditty to hep decrypt the AES session key
        session_key = cipher.decrypt(ciphertext)
        try:
            session_key = session_key.decode('utf8')
        except:
            pass
        return session_key

    def aesenc(self, data, *args):
        #encrypt the payload using AES
        key = ''
        if args:
            if 'str' in str(type(args[0])):
                try:
                    key = int(args[0])
                except:
                    key = get_random_bytes(16)
        else:
            key = get_random_bytes(16)
        try:
            data = data.encode('utf8')
        except:
            pass
        cipher = AES.new(key, AES.MODE_EAX)
        ciphertext, tag = cipher.encrypt_and_digest(data)
        aesencdict = {
        'ciphertext' : ciphertext,
        'tag' : tag,
        'nonce' : cipher.nonce ,
        'key' : key
        }
        return(aesencdict)

    def aesdec(self, aesdict):
        #decrypt the AES encrypted payload
        cipher = AES.new(aesdict['key'], AES.MODE_EAX, aesdict['nonce'])
        data = cipher.decrypt_and_verify(aesdict['ciphertext'], aesdict['tag'])
        try:
            data = data.decode('utf8')
        except:
            pass
        return data

    def end2enc(self, val, cipher = pubcipher):
        # a master function to first encrypt the payload
        val = str(val)
        encval = aesenc(val)
        # and then PK encrypt the key
        encval['key'] = encrypt_val(encval['key'], cipher)
        return encval

    def end2dec(self, encval, cipher = privcipher):
        encval['key'] = decrypt_val(encval['key'], cipher)
        outval = aesdec(encval['aesdict'], encval['key'])
        return outval

Тестовая функция и основная:

def test():
    val = { 'test' : "hello"}
    keypair = statEnc()
    print(str(type(keypair)))
    encval = keypair.end2enc(val, keypair.pubcipher)
    outval = keypair.end2dec(encval, keypair.privcipher)
    print(val, outval)
    if val == eval(outval):
        return(val)
    else:
        return False

if __name__ == '__main__':
    test()

[ОБНОВЛЕНИЕ] Трассировка выглядит следующим образом:

[guha@katana stat]$ python statenc.py 
<class '__main__.statEnc'>
Traceback (most recent call last):
  File "statenc.py", line 124, in <module>
    test()
  File "statenc.py", line 115, in test
    encval = keypair.end2enc(val, keypair.pubcipher)
  File "statenc.py", line 100, in end2enc
    encval = aesenc(val)
NameError: name 'aesenc' is not defined

person kilokahn    schedule 04.07.2017    source источник
comment
размещение трассировки ошибок было бы плюсом.   -  person Jean-François Fabre    schedule 04.07.2017
comment
Добавил трассировку - спасибо, что указали, что я пропустил это! :)   -  person kilokahn    schedule 04.07.2017


Ответы (1)


Проспал свой вопрос, проснулся на свежую голову, и вуаля! ответ представился сам собой.

Ответ на второй вопрос таков: 2. поставить простое «я». решает проблему - я вызывал «aesenc (params)» вместо «self.aesenc (params)». Глупо с моей стороны, правда.

Ответ на вопрос 1 дан в этом вопросе SO .

person kilokahn    schedule 05.07.2017