0

ファイルを暗号化し、暗号化されたコンテンツを同じファイルに書き込みました。しかし、ファイルを復号化して同じファイルに書き込もうとすると、古いコンテンツ、つまり暗号化されたテキストをクリアできません。どうすればそれができますか。

暗号化コード

static void EncryptFile(string sInputFilename,string sKey)
    {
        FileStream fsInput = new FileStream(sInputFilename,
           FileMode.Open,
           FileAccess.ReadWrite);

        DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
        DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
        ICryptoTransform desencrypt = DES.CreateEncryptor();
        CryptoStream cryptostream = new CryptoStream(fsInput,
           desencrypt,
           CryptoStreamMode.Write);

        byte[] bytearrayinput = new byte[fsInput.Length];
        fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
        fsInput.SetLength(0);
        cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
        cryptostream.Close();
        fsInput.Close();
    }

コードの解読

static void DecryptFile(string sInputFilename,
     string sKey)
    {
        DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
        DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
        DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
        FileStream fsread = new FileStream(sInputFilename,
           FileMode.Open,
           FileAccess.ReadWrite);

        ICryptoTransform desdecrypt = DES.CreateDecryptor();

        CryptoStream cryptostreamDecr = new CryptoStream(fsread,
           desdecrypt,
           CryptoStreamMode.Read);
        int data;

        while ((data = cryptostreamDecr.ReadByte()) != -1)
        {
            fsread.WriteByte((byte)data);
        }

        fsread.Close();
        cryptostreamDecr.Close();
    } 
4

1 に答える 1

1

暗号化されたファイルを復号化している間に、暗号化されたファイルに書き込もうとしているため、読み取りを完了する前に、暗号化されていないデータを最後に追加することになります。

何らかの理由で lcryder の提案に従うことができないと仮定すると、最後にデータを同じファイルに書き戻す必要がある場合は、メモリ内で復号化し、終了したら書き込むことができます。

private static void DecryptFile(string sInputFilename,
    string sKey)
{
    var DES = new DESCryptoServiceProvider();
    DES.Key = Encoding.ASCII.GetBytes(sKey);
    DES.IV = Encoding.ASCII.GetBytes(sKey);
    ICryptoTransform desdecrypt = DES.CreateDecryptor();

    using(var fsread = new FileStream(sInputFilename,
        FileMode.Open,
        FileAccess.ReadWrite))
    {
        using(var cryptostreamDecr = new CryptoStream(fsread,
            desdecrypt,
            CryptoStreamMode.Read))
        {
            int data;

            fsread.Flush();

            using(var ms = new MemoryStream())
            {
                while((data = cryptostreamDecr.ReadByte()) != -1)
                {
                    ms.WriteByte((byte) data);
                }

                cryptostreamDecr.Close();

                using(var fsWrite = new FileStream(sInputFilename, FileMode.Truncate))
                {
                    ms.WriteTo(fsWrite);
                    ms.Flush();
                }
            }
        }
    }
}

メモリ ストリームは暗号化されていないデータを保持しますが、読み取りファイル ストリームを閉じて、書き込み用に新しいファイル ストリームを開きます (FileMode.Truncate を使用して、元のコンテンツが破棄されるようにします)。

于 2013-05-23T14:05:21.307 に答える