Десериализация зашифрованных объектов из файла - PullRequest
0 голосов
/ 07 января 2019

Я хочу десериализовать зашифрованные объекты (несколько экземпляров одного и того же типа объекта) из файла, который был добавлен во время выполнения программы. Объекты были зашифрованы с использованием CryptoStream. Однако при десериализации я не могу перебрать cryptoStream, как я и предполагал.

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

Я пробовал разные подходы к циклу через поток. Также я пробовал другие криптопотоки и обходил эту проблему.

Сериализация:

private void EncryptObjectToFile(TraceMessage pMessage, FileInfo pFileInfo)
    {
        if (pFileInfo == null) { pFileInfo = m_LogFile; }

        m_Formatter.Serialize(m_SerializedStream, pMessage);
        m_SerializedStream.Position = 0;

        using (FileStream logfile = new FileStream(m_LogFile.FullName, FileMode.Append))
        {
            using (CryptoStream cryptoStream = new CryptoStream(logfile, m_Algorythm.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                cryptoStream.Write(m_SerializedStream.ToArray(), 0, (int)m_SerializedStream.Length);
                cryptoStream.FlushFinalBlock();
            }
        }
    }

десериализация:

private List<TraceMessage> DecryptObjectsFromFile(FileInfo pFileInfo)
    {
        List<TraceMessage> tmp = new List<TraceMessage>();

        try
        {
            READWRITELOCK.AcquireReaderLock(READERTIMEOUTS);
            Interlocked.Increment(ref READS);

            try
            {
                if (pFileInfo == null) { pFileInfo = m_LogFile; }

                m_SerializedStream.Position = 0;

                using (FileStream logfile = new FileStream(m_LogFile.FullName, FileMode.Open))
                {
                    using (var cryptoStream = new CryptoStream(logfile, m_Algorythm.CreateDecryptor(key, iv), CryptoStreamMode.Read))
                    {
                        if (cryptoStream.CanRead)
                        {
                            while (cryptoStream.Position < cryptoStream.Length)
                            {
                                tmp.Add((TraceMessage)m_Formatter.Deserialize(cryptoStream));
                            }
                        }
                    }
                }
            }
            catch(Exception exp) { }
            finally
            {
                READWRITELOCK.ReleaseReaderLock();
                Interlocked.Decrement(ref READS);
            }
        }
        catch (Exception) { }

        return tmp;
    }

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

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