#python-3.x #oop #printing #attributes
#python-3.x #ооп #печать #атрибуты
Вопрос:
Я работаю с некоторым старым кодом Python2 из конкурса differential power analysis (DPA), прошедшего давным-давно (http://www.dpacontest.org/home/index.html). Код, который я изменяю, можно найти здесь (https://svn.comelec.enst.fr/dpacontest/code/reference /)
Текущая проблема, которая сводит меня с ума: по сути, некоторые объекты Python в этом коде «сотрут» сами себя или вернутся к своим значениям по умолчанию, и я понятия не имею, почему. Я не могу найти какой-либо код в логическом потоке, который делает это, и я не думаю, что это проблема области видимости.
Я пытался переписать части кода, чтобы использовать numpy вместо отображения лямбда-функций. Я также перепробовал множество различных порядков кода и извлечения методов из их классов и попыток запустить их локально / встроенно.
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. можете ли вы предоставить логин htaccess для ссылки на код, который вы предоставляете
2. Да, извините, это на веб-странице. Пользователь: гость, передача: гость. Также я думаю, что я разобрался со своей проблемой. Проблема заключается в отображении Python2 -> Python3 map. Атрибуты — это карты, которые, похоже, не сохраняются, поэтому превращение их в списки устранило проблему для меня.
Ответ №1:
Итак, я, похоже, устранил проблему после сна. Атрибуты класса создавались с помощью map, которая возвращает список в Python2, но не в Python3. Превращение их в списки с помощью list() решает проблему сохранения. Я не мог бы сказать вам, почему печать атрибута карты приводит к его самоочищению.
Комментарии:
1. Поскольку карты являются ленивыми итераторами, они выполняются за один проход