Python Pickle, проблема с загрузкой при возврате в список - PullRequest
0 голосов
/ 12 июня 2018

Я использую pickle для сериализации списка объектов, шифрую сериализованную строку, а затем использую pickle, чтобы выгрузить ее в файл, чтобы позже можно было прочитать ее в обратном порядке.Я понимаю, что это может быть обходной путь, но теоретически я не могу понять, почему при перезагрузке данных он продолжает давать сбой.Позвольте мне сначала извиниться за мои ужасные соглашения об именах, когда однажды они улучшатся.
Я выкинул приведенный ниже код, ошибка возникает только в самом конце при загрузке данных обратно в список и завершается со следующей ошибкой:

  Traceback (most recent call last):
  File "servertest.py", line 453, in <module>
  mylist = mary1.ReadFromFile()
  File "servertest.py", line 142, in ReadFromFile
  mrylist = pickle.loads(datastring)
  File "C:\Python27\lib\pickle.py", line 1388, in loads
  return Unpickler(file).load()
  File "C:\Python27\lib\pickle.py", line 864, in load
  dispatch[key](self)
  KeyError: '\xa7'

Я распечатывал данные на каждом шаге при вызове функций записи и чтения, и это нормально:

Это необработанные данные

]q ((c__main__
User
q☺oq☻}q♥(U☻idq♦U♦daveq♣U♥pinq♠U☻22qub(h☺o}q     (h♦U♦maryq
h♠U♥434q♂ube.

этоэто зашифрованные данные

 '▼ES╬NZ┴w▲sæô▄Hó^┴☻½K◄6►ëΘ░¡√╡▼/ⁿ♀*a]ì╡
5åα¬δ⌡D╓£o¶α{ô √■♣í♠.|H^E«√☼Hwñ/cúw╠Σ√↔↔╞╞┼3

это кодированные данные

  '▼ES╬NZ┴w▲sæô▄Hó^┴☻½K◄6►ëΘ░¡√╡▼/ⁿ♀*a]ì╡
5åα¬δ⌡D╓£o¶α{ô √■♣í♠.|H^E«√☼Hwñ/cúw╠Σ√↔↔╞╞┼3

незашифрованные данные

]q ((c__main__
User
q☺oq☻}q♥(U☻idq♦U♦daveq♣U♥pinq♠U☻22qub(h☺o}q     (h♦U♦maryq
           h♠U♥434q♂ube.

Ниже показаны две функции, которые я использую:

def WriteToFile(self, mrlist):        

    self.mrlist = mrlist
    rawdata = pickle.dumps(mrlist, 1)

    #print 'rawdata1\n' + rawdata

    #encrypt pickled list (call on my encryption functions)
    encrydata = self.encryptmessage.EncrMsg(rawdata)

    print('this is encrypt data \n ' + encrydata)

    #Open and dump encrypted string to file
    file=open(self.fn,"wb")
    pickle.dump(encrydata, file, 1)

    file.close()

#Function to call when reading the file
def ReadFromFile(self):

    mrylist = []
    #open file and load
    file = open(self.fn, "rb")
    encdata = pickle.load(file)
    file.close

    print('this is enc data*********\n  ' + encdata)
    #Decrypt the string        
    datastring = self.encrytmessage.DeCryptMsh(encdata)

    print 'unencrypted data' + datastring
    mrylist = pickle.loads(datastring)
    return mrylist`

Редактировать: ниже показан простой пользовательский класс для тех, кому интересно посмотреть, что содержит список:

class User:
def __init__(self, id, pin):
    self.id = id
    self.pin = pin
def getpair(self):
    return ' %s " | " %s ' % (self.id, self.pin)

def edit_pin(self, pin1):
    self.pin = pin1

1 Ответ

0 голосов
/ 12 июня 2018

Решение Мне удалось разобраться в этом, мой оригинальный способ сделать это работал нормально, и это на самом деле не было проблемой с рассолом.Похоже, что мой вектор инициализации при вызове функции дешифрования отличался от того, который был изначально зашифрован.Это все еще приводило к идентичной строке, когда происходило дешифрование, но, должно быть, включало некоторые различия, которые я не смог увидеть.Я переписал класс ReadWrite, чтобы использовать функции чтения и записи вместо использования pickle для выгрузки сериализованного / зашифрованного списка в файл.Я также начал записывать IV на внешнее устройство, чтобы его можно было прочитать методом расшифровки при следующей загрузке программы.Спасибо за любую помощь и предложения.

...