C# 如何解码和解压文本?

C# 如何解码和解压文本?,c#,.net,stream,C#,.net,Stream,我想创建大文本,压缩它,编码并保存到文件中。然后我想破译并提取文本,并将其保存到简单的文本文件中 我对第一步(创建加密和压缩文件)没有问题,但我对第二步也有问题——为了获取信息(请阅读我代码中的注释)。我做错了什么 using System; using System.IO; using System.Text; using System.IO.Compression; using System.Security.Cryptography; static class Program {

我想创建大文本,压缩它,编码并保存到文件中。然后我想破译并提取文本,并将其保存到简单的文本文件中

我对第一步(创建加密和压缩文件)没有问题,但我对第二步也有问题——为了获取信息(请阅读我代码中的注释)。我做错了什么

using System;
using System.IO;
using System.Text;
using System.IO.Compression;
using System.Security.Cryptography;

static class Program
{
    static void Main()
    {
        Console.WriteLine("Create encrypted archive...");
        var fileName = @"data.xgzip";

        byte[] key = null;
        byte[] iv = null;

        // I want to create big text, squeeze it, encode and save into file:
        // 1. Create big text.
        // 2. Squeeze text.
        // 3. Encode squeezed text.
        // 4. Write result to file.

        using (var stream = new FileStream(fileName, FileMode.Create, 
            FileAccess.Write, FileShare.None, 0x1000, FileOptions.None))
        {
            using (var rijn = Rijndael.Create())
            {
                key = rijn.Key;
                iv = rijn.IV;

                var encryptor = rijn.CreateEncryptor(key, iv);

                using (var encStream = new CryptoStream(stream, encryptor, 
                    CryptoStreamMode.Write))
                {
                    using (var zip = new DeflateStream(encStream, 
                        CompressionLevel.Optimal))
                    {
                        using (var writer = new StreamWriter(zip, new UTF8Encoding(
                        encoderShouldEmitUTF8Identifier: false, 
                        throwOnInvalidBytes: true), 0x1000, true))
                        {
                            var text = "One, two, three, four, five...";
                            for (int n = 0; n < 1000; n++)
                            {
                                writer.WriteLine(text);
                            }
                        }
                        Console.WriteLine("zip.Length = {0}", stream.Length);
                    }
                }
            }
        }

        var fi = new FileInfo(fileName);
        Console.WriteLine("File size: {0}", fi.Length);

        // Now I want to decipher and extract my file into simple text file.
        // 1. Decode squeezed data.
        // 2. Unpack decoded data.
        // 4. Write result to text file.

        Console.WriteLine("Extract encrypted archive...");
        var fileName2 = @"data.txt";

        using (var stream = new FileStream(fileName, FileMode.Open, 
            FileAccess.Read, FileShare.None, 0x1000, FileOptions.None))
        {
            using (var rijn = Rijndael.Create())
            {
                var encryptor = rijn.CreateEncryptor(key, iv);

                using (var cryptoStream = new CryptoStream(stream, encryptor, 
                    CryptoStreamMode.Read))
                {
                    using (var zip = new DeflateStream(cryptoStream, 
                        CompressionMode.Decompress))
                    {
                        using (var reader = new StreamReader(zip, 
                            new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, 
                            throwOnInvalidBytes: true)))
                        {
                            // System.IO.InvalidDataException: 
                            // "The archive entry was compressed using an unsupported 
                            // compression method."
                            var text = reader.ReadToEnd();

                            // Write the result into the simple text file.
                            using (var stream2 = new FileStream(fileName2, 
                                FileMode.Create, FileAccess.Write, FileShare.None,
                                0x1000, FileOptions.None))
                            {
                                using (var writer = new StreamWriter(stream2, 
                                    new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, 
                                    throwOnInvalidBytes: true), 0x1000, true))
                                {
                                    writer.Write(text);
                                }
                                Console.WriteLine("stream.Length = {0}", stream.Length);
                            }
                        }
                    }
                }
            }
        }

        var fi2 = new FileInfo(fileName2);
        Console.WriteLine("File size: {0}", fi2.Length);

        Console.WriteLine("Press any key for exit...");
        Console.ReadKey();
    }
}
使用系统;
使用System.IO;
使用系统文本;
使用系统IO压缩;
使用System.Security.Cryptography;
静态类程序
{
静态void Main()
{
WriteLine(“创建加密存档…”);
var fileName=@“data.xgzip”;
字节[]键=空;
字节[]iv=空;
//我想创建大文本,压缩它,编码并保存到文件中:
//1.创建大文本。
//2.压缩文本。
//3.对压缩文本进行编码。
//4.将结果写入文件。
使用(var stream=newfilestream)(文件名,FileMode.Create,
FileAccess.Write,FileShare.None,0x1000,FileOptions.None)
{
使用(var rijn=Rijndael.Create())
{
key=rijn.key;
iv=rijn.iv;
var encryptor=rijn.CreateEncryptor(密钥,iv);
使用(var encStream=新加密流(流、加密器、,
CryptoStreamMode.Write)
{
使用(var zip=new DeflateStream(encStream,
压缩水平(最佳)
{
使用(var writer=newstreamwriter(zip,新UTF8编码(
编码器应提交F8标识符:false,
throwOnInvalidBytes:true),0x1000,true)
{
var text=“一、二、三、四、五…”;
对于(int n=0;n<1000;n++)
{
writer.WriteLine(文本);
}
}
WriteLine(“zip.Length={0}”,stream.Length);
}
}
}
}
var fi=新文件信息(文件名);
WriteLine(“文件大小:{0}”,fi.Length);
//现在我想把我的文件解密并解压缩成简单的文本文件。
//1.解码压缩数据。
//2.解包解码数据。
//4.将结果写入文本文件。
WriteLine(“提取加密存档…”);
var fileName2=@“data.txt”;
使用(var stream=newfilestream)(文件名,FileMode.Open,
FileAccess.Read,FileShare.None,0x1000,FileOptions.None)
{
使用(var rijn=Rijndael.Create())
{
var encryptor=rijn.CreateEncryptor(密钥,iv);
使用(var cryptoStream=新加密流(流、加密器、,
CryptoStreamMode.Read)
{
使用(var zip=new DeflateStream(cryptoStream,
压缩模式(解压缩模式)
{
使用(var reader=newstreamreader(zip、,
新的UTF8Encoding(编码器应指定UTF8Identifier:false,
throwOnInvalidBytes:true)))
{
//System.IO.InvalidDataException:
//“存档项是使用不受支持的
//压缩方法。”
var text=reader.ReadToEnd();
//将结果写入简单文本文件。
使用(var stream2=newfilestream(fileName2,
FileMode.Create,FileAccess.Write,FileShare.None,
0x1000,文件选项。无)
{
使用(var writer=newstreamwriter(stream2,
新的UTF8Encoding(编码器应指定UTF8Identifier:false,
throwOnInvalidBytes:true),0x1000,true)
{
作者:写(文本);
}
WriteLine(“stream.Length={0}”,stream.Length);
}
}
}
}
}
}
var fi2=新文件信息(fileName2);
WriteLine(“文件大小:{0}”,fi2.Length);
Console.WriteLine(“按任意键退出…”);
Console.ReadKey();
}
}

在解码部分,您仍在使用加密程序对内容进行解密,正确的方法应该是使用解密程序

更新解码部分中的以下行

var encryptor = rijn.CreateEncryptor(key, iv);

using (var cryptoStream = new CryptoStream(stream, encryptor, 
      CryptoStreamMode.Read))


然后,您的代码应该可以在解码部分工作,您仍然在使用加密程序对内容进行解密,正确的方法应该是使用解密程序

更新解码部分中的以下行

var encryptor = rijn.CreateEncryptor(key, iv);

using (var cryptoStream = new CryptoStream(stream, encryptor, 
      CryptoStreamMode.Read))

那么你的代码应该可以工作了