从文件反序列化加密对象

时间:2019-01-06 23:02:14

标签: c# file encryption stream

我想从文件中反序列化在执行程序期间添加的加密对象(相同对象类型的多个实例)。使用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;
    }

最后,我要达到的目的是加密对象(相同对象类型的多个实例)并将其添加到文件中。由于可以随时添加文件,并且不能将其收集到列表中,然后再写入文件,因此我想将这些对象添加到现有文件中。 稍后,我想重新创建每个加密并序列化到文件的对象。

0 个答案:

没有答案