2016-07-31 3 views
0

Я написал следующие классы, чтобы иметь возможность тестировать различные схемы шифрования. Тем не менее, у меня возникли проблемы с созданием объектов из разных схем шифрования. Может ли кто-то указать на то, что не имеет смысла, что я не поймаю atm? Я не уверен, почему это не работает. Он дает TypeError: encrypt() takes exactly 3 arguments (2 given), но он сам прошел, поэтому я не знаю, как исправить его на основе остальных.Экземпляры и классы: требуется x аргументов при задании x-1

class AXU: 
    def __init__(self, sec_param): 
     self.sec_param = sec_param 

    def getHash(self): 
     # sample a, b and return hash function 
     a = random.randrange(self.sec_param) 
     b = random.randrange(self.sec_param) 

     return lambda x : a*x+b % sec_param 

class BC(object): 
    def __init__(self, sec_param): 
     # generate a key 
     self.sec_param = sec_param 

    def encrypt(self, message, key): 
     #encrypt with AES? 
     cipher = AES.new(key, MODE_CFB, sec_param) 
     msg = iv + cipher.encrypt(message) 
     return msg 

class tBC(object): 
    def __init__(self, sec_param): 
     self.sec_param = sec_param 

    def encrypt(self, tweak, message): 
     #pass 
     return AES.new(message, tweak) 

class Trivial(tBC): 
    def __init__(self): 
     self.bcs = {} 

    def encrypt(self, tweak, message): 
     if tweak not in self.bcs.keys(): 
      bc = BC() 
      self.bcs[tweak] = bc 
     return self.bcs[tweak].encrypt(message) 

class Our(tBC): 
    def __init__(self, sec_param): 
     self.bc1 = BC(sec_param) 
     self.bc2 = BC(sec_param) 
     self.bc3 = BC(sec_param) 
     self.bc4 = BC(sec_param) 
     # encryption over GF field 
    def encrypt(self, tweak, message): 
     return self.bc1.encrypt(self.bc2.encrypt(tweak) * self.bc3.encrypt(message) + self.bc4.encrypt(tweak)) 
+0

Где, по-вашему, вы передаете два аргумента (кроме 'self')? Все вызовы 'encrypt' имеют один аргумент. –

+0

Пожалуйста, включите * full * traceback. Я могу догадаться, где именно происходит ошибка, но полная трассировка скажет нам наверняка и убедитесь, что я не пропустил другой случай. –

ответ

1

Вы передаете в один аргумент связанного метода:

return self.bc1.encrypt(
    self.bc2.encrypt(tweak) * self.bc3.encrypt(message) + 
    self.bc4.encrypt(tweak)) 

Это один аргумент BC.encrypt() метода каждого, и этот метод занимает 2 за self, message и key.

либо передавать значение для key или удалить этот аргумент из определения BC.encrypt() метода (и получить ключ от какого-то другого места, может быть, из экземпляра атрибута устанавливается в __init__).

Смежные вопросы