user65165 user65165 - 5 months ago 28
Python Question

Instances & classes: requiring x arguments when x-1 given

I have written the following classes to be able to test different encryption schemes. However, I'm having trouble instantiating objects from the different encryption scheme. Could someone point out to something that doesn't make sense that I'm not catching atm? I'm not sure why it doesn't work. It gives a

TypeError: encrypt() takes exactly 3 arguments (2 given)
but it does have self passed, so I don't know how to fix it on the basis of the rest of them.

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 =, 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):
return, 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))

edit: my bad sorry. forgot to add this

message_instance = 'This is a message to the board of directors.'
tweak = os.urandom(16) #16 bytes=128 bits
our_encr = Our(256)
our_encr.encrypt(message_instance, tweak)


You are passing in one argument to a bound method:

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

That's one argument to the BC.encrypt() method each, and this method takes 2 beyond self, message and key.

Either pass in a value for key, or remove that argument from the BC.encrypt() method definition (and get the key from some place else; perhaps from an instance attribute set in __init__).