2014-11-23 3 views
0

Я пытаюсь создать AIS-код для криптографии, и у меня возникают ошибки, с которыми мне нужна помощь.AttributeError: Экземпляр шифрования не имеет атрибута '__getitem__'

 File "C:\Users\work\Desktop\try.py", line 156, in byte_construct 
     if (pos & array_8[i]): 
    AttributeError: Encryption instance has no attribute '__getitem__' 

Я продолжаю получать ошибку выше. Может кто-нибудь дать мне решение. Ниже мой источник

def rotate_byte_left(byte): 
    value = 0x00 
    value = byte & 0x80 
    byte = byte << 1 
    byte = byte & 0xFF 
    if value == 0x80: 
     byte = byte | 0x01 
    return byte 

def rotate_byte_right(byte): 
    value = 0x00 
    value = byte & 0x01 
    byte = byte >> 1 
    byte = byte & 0xFF 
    if value == 0x01: 
     byte = byte | 0x80 
    return byte 

def byte_construct(array_8,bit_pos): 
    byte = 0x00 
    for p in bit_pos: 
     pos = (0x01 << p) 
    for i in range(0,8): Specifically the error is poiting here. 
     if (pos & array_8[i]): 
      byte = byte & (0x01 << bit_pos) 
    return byte 

def addRoundKey(self, state, roundKey): 
    """Adds (XORs) the round key to the state.""" 
    for i in range(0, len(state)): 
     state[i] ^= roundKey[i] 
    return state  

def ecb(self, plaintext, key): 
    start = time.time() 
    pre_round1 = self.convert_hex_to_list(plaintext^key) 
    substitution_result = self.subBytes(pre_round1, False) 
    permutaion_result = self.byte_construct(substitution_result) 

if __name__ == "__main__": 
    encrypt = Encryption() 
    encrypt.ecb(0x0000000000000000, 0x00FF00FF00FF00FF) 
    print encrypt.convert_list_to_hex([255,0,255]) 
+0

Это, вероятно, означает, что ваш 'array_8' не является индексируемым, т. Е. Вы не можете писать' array_8 [i] ' – 0sh

+0

. Кроме того, вызов модуля' try' - плохая идея, потому что поскольку это ключевое слово Python, вы не можете импортировать его, используя что-то вроде 'import try'. – DSM

+0

У вас недостаточно данных для ответа, пожалуйста, pdate метод self.sunBytes и проверьте (или просто добавьте печать), что он возвращает, ответ есть – Rustem

ответ

0

Функция byte_construct() не метод экземпляра класса шифрования, но вы вызываете его, как это

permutation_result = self.byte_construct(substitution_result) 

Что это означает, что теперь byte_construct будет использовать self в его первый аргумент (array-8 в этом случае) и substitution_result в качестве второго аргумента (bit_pos). Поскольку self является объектом шифрования, который, как я предполагаю, не предназначен для индексирования (т. Е. Вы не определили его self.__getitem__()), вы получили указанную выше ошибку.

+0

, и какое решение вы можете предоставить здесь? –

+0

решение состоит в том, что вам нужно внимательно изучить объявление 'byte_construct()' и соответствующим образом настроить его обращение. В настоящее время вы вызываете его как метод экземпляра класса Encryption, но он не определяется как таковой (т. Е. Он не определен в классе Encryption, и он не принимает сам в качестве первого аргумента). Спросите себя: какой тип должен быть 'array_8'? Если это должен быть объект Encryption, тогда сделайте 'byte_construct' метод экземпляра. Если это не так, то удалите префикс 'self.', когда вы его вызываете, и предоставьте ему объект, который должен быть' array_8'. – oxymor0n

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