Атрибуты класса в объектах Python «стирают» себя - PullRequest
2 голосов
/ 24 апреля 2019

Я работаю со старым кодом Python2 из конкурса дифференциального анализа мощности (DPA) с давних времен (http://www.dpacontest.org/home/index.html). Код, который я изменяю, можно найти здесь (https://svn.comelec.enst.fr/dpacontest/code/reference/)

* 1005)* Текущая проблема, которая сводит меня с ума: по сути, некоторые объекты Python в этом коде будут «стирать» себя или переходить к значениям по умолчанию, и я понятия не имею, почему. Я не могу найти какой-либо код в логическом потоке, который делает это, иЯ не думаю, что это проблема области.

Я пытался переписать части кода, чтобы использовать numpy вместо отображения лямбда-функций. Я также попробовал множество различных порядков кода и извлечения методових классов и пытается запустить их локально / inline.

main.py:

loc_subkeys = brk.get_subkeys()

des_breaker.py

def get_subkeys(self):
    """
    Returns a vector of currently best sboxes subkeys.
    This is an array of 8 integers.
    """
    sk = np.array([])
    for i in range(8):
        sk = np.append(sk, self.__sbox_breakers[i].get_key())
    return sk

sbox_breaker.py

def get_key(self):
    "Gives the current best key"
    if self.__best_key is None:
        marks = np.array([])
        print("p0: ", len(list(self.__key_estimators[0]._key_estimator__p0)))
        print("p1: ", len(list(self.__key_estimators[0]._key_estimator__p1)))
        print("p0: ", len(list(self.__key_estimators[0]._key_estimator__p0)))
        print("p1: ", len(list(self.__key_estimators[0]._key_estimator__p1)))
        for i in range(64):
            ke = self.__key_estimators[i]
            marks = np.append(marks, ke.get_mark())
            self.__best_key = np.argmax(marks)
        return self.__best_key

key_estimator.py - атрибуты

class key_estimator:
    """
    Provides methods to give a mark to the key relatively to the probability f
    the correctness of the key.
    """
    __sbox = None
    __key = None
    __cnt0 = 0    # The accumulated traces count in partition 0
    __cnt1 = 0    # The accumulated traces count in partition 1
    __p0 = None  # The bit=0 estimated partition
    __p1 = None  # The bit=1 estimated partition
    __diff = np.array([])  # The differential trace

Операторы печати в sbox_breaker - мои. Их вывод - единственная подсказка, которую я имею сейчас:

p0: 5003 (Хорошо)

p1: 5003 (хорошо)

p0:0 (???)

p1: 0

Что дает?Второй раз атрибуты класса key_estimator, казалось, стираются.Это происходит со всеми атрибутами, а не только с p0 и p1.

Первый цикл этой программы работает, но на второй итерации (начиная с main) он завершается неудачно, поскольку атрибуты стерлись сами собой.Я могу «стереть» их вручную, просто распечатав атрибуты объекта.

1 Ответ

0 голосов
/ 24 апреля 2019

Так что я, кажется, решил проблему после сна на нем. Атрибуты класса создавались картой, которая возвращает список в Python2, но не Python3. Создание их в списки с помощью list () решает проблему постоянства. Я не могу сказать вам, почему печать атрибута карты заставляет его очищаться, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...