C# 流字符串行加密并保存到文件

C# 流字符串行加密并保存到文件,c#,encryption,C#,Encryption,我需要创建一个以制表符分隔的加密文件。另一个要求是对文件进行加密和解密,并读取文件行。理想情况下,我只想保存一个加密的文件,而不是流式处理中的未加密文件 对于加密的,我将有一个main方法,它将创建字符串(行字符串),并将它们传递给一个加密并保存到文件的方法。下面的代码是我写的 public bool EncryptFileString(string inputString, string outputFile) { try { s

我需要创建一个以制表符分隔的加密文件。另一个要求是对文件进行加密和解密,并读取文件行。理想情况下,我只想保存一个加密的文件,而不是流式处理中的未加密文件

对于加密的,我将有一个main方法,它将创建字符串(行字符串),并将它们传递给一个加密并保存到文件的方法。下面的代码是我写的

public bool EncryptFileString(string inputString, string outputFile)
    {
        try
        {
            string cryptFile = outputFile;
            FileStream fsCrypt = new FileStream(cryptFile, FileMode.OpenOrCreate, FileAccess.Write);

            RijndaelManaged RMCrypto = new RijndaelManaged();

            CryptoStream cs = new CryptoStream(fsCrypt,
                RMCrypto.CreateEncryptor(this.keyPhrase, this.initializationVector),
                CryptoStreamMode.Write);

            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(inputString));

            int data;
            while ((data = ms.ReadByte()) != -1)
                cs.WriteByte((byte)data);


            cs.Close();
            fsCrypt.Close();

            cs.Dispose();
            fsCrypt.Dispose();

            return true;
        }
        catch (Exception de)
        {
            return false;
            //TODO : Log
        }
    }
对于解密,我不知道如何做到这一点。我能得到的是下面的。在本例中,我试图解密文件并将其保存在另一个文件中,但理想情况下,我希望使用流式传输线,而不是保存未加密的文件然后读取它

public bool DecryptFile(string inputFile, string outputFile)
    {
        try
        {
            FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);

            RijndaelManaged RMCrypto = new RijndaelManaged();
            
            CryptoStream cs = new CryptoStream(fsCrypt,
                RMCrypto.CreateDecryptor(this.keyPhrase, this.initializationVector),
                CryptoStreamMode.Read);

            List<byte> fsOut = new List<byte>();// new FileStream(outputFile, FileMode.Create);

            int data;
            while ((data = cs.ReadByte()) != -1)
                fsOut.Add((byte)data);
                //fsOut.WriteByte((byte)data);

            

            //fsOut.Close();
            cs.Close();
            fsCrypt.Close();

            var str = Encoding.UTF8.GetString(fsOut.ToArray());

            File.WriteAllText(outputFile,str);

            return true;
        }
        catch (Exception de)
        {
            return false;
            //TODO : Log
        }
    }
public bool解密文件(字符串输入文件、字符串输出文件)
{
尝试
{
FileStream fsCrypt=newfilestream(inputFile,FileMode.Open);
RijndaelManaged RMCrypto=新的RijndaelManaged();
CryptoStream cs=新加密流(fsCrypt,
RMCrypto.CreateDecryptor(this.keyphase,this.initializationVector),
CryptoStreamMode.Read);
List fsOut=new List();//新文件流(outputFile,FileMode.Create);
int数据;
而((data=cs.ReadByte())!=-1)
fsOut.Add((字节)数据);
//写字节((字节)数据);
//fsOut.Close();
cs.Close();
fsCrypt.Close();
var str=Encoding.UTF8.GetString(fsOut.ToArray());
writealText(outputFile,str);
返回true;
}
捕获(异常de)
{
返回false;
//TODO:日志
}
}
在测试时,我调用加密方法传递文件字符串并保存它,然后调用解密。但结果文件顶部缺少2行,并且无法解密几个字符(例如:和/(如“https”))

我获取了一些示例来加密文件(它可以工作),其中输入和输出文件都保存在磁盘上。但是没有找到任何处理字符串和文件的东西

欢迎提出任何建议

  • 尚卡尔
试试这个(通过检查、尝试/捕获等改进)

private static string key=”“;
私有静态字符串iv=“”;
private static readonly string someString=“敏捷的棕色狐狸跳过懒惰的狗”;
私有静态只读字符串targetFile=Path.Combine(AppDomain.CurrentDomain.BaseDirectory,“encrypted.txt”);
静态void Main(字符串[]参数)
{
GenerateKeyIv();
加密文件();
var decryptedFile=DecryptFile();
Console.WriteLine(解密文件);
}
静态void encryptofile()
{
使用(var rijndeal=new RijndaelManaged{Key=Convert.FromBase64String(Key),IV=Convert.FromBase64String(IV)})
{
var encryptor=rijndeal.CreateEncryptor(rijndeal.Key,rijndeal.IV);
使用var fs=new FileStream(targetFile,FileMode.Create);
//写入文件流
使用(CryptoStream cs=新的CryptoStream(fs,encryptor,CryptoStreamMode.Write))
使用(StreamWriter sw=新StreamWriter(cs))
{
sw.Write(someString);
}
}
}
静态字符串解密文件()
{
使用(var rijndeal=new RijndaelManaged{Key=Convert.FromBase64String(Key),IV=Convert.FromBase64String(IV)})
{
var encryptor=rijndeal.CreateDecryptor(rijndeal.Key,rijndeal.IV);
使用var fs=new FileStream(targetFile,FileMode.Open);
//从文件流读取
使用(CryptoStream cs=新的CryptoStream(fs、encryptor、CryptoStreamMode.Read))
使用(StreamReader sr=新StreamReader(cs))
{
返回sr.ReadToEnd();
}
}
}
/// 
///创建密钥和IV的示例
///用于加密的相同密钥/IV必须用于解密
///要使用相同的密钥/iv对文件进行加密/解密,请将这些密钥保存在某个位置以供重用(此示例在每次运行时创建这些密钥)
/// 
静态无效生成器keyiv()
{
使用(var rijndael=new RijndaelManaged())
{
rijndael.GenerateIV();
rijndael.GenerateKey();
key=Convert.tobase64字符串(rijndael.key);
iv=Convert.tobase64字符串(rijndael.iv);
}
}

private static string key = "";
private static string iv = "";
private static readonly string someString = "The quick brown fox jumps over the lazy dogs";
private static readonly string targetFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "encrypted.txt");


static void Main(string[] args)
{
   GenerateKeyIv();
   EncryptToFile();
   
   var decryptedFile = DecryptFile();
   Console.WriteLine(decryptedFile);

}

static void EncryptToFile()
{
   using (var rijndeal = new RijndaelManaged { Key = Convert.FromBase64String(key), IV = Convert.FromBase64String(iv) })
   {
      var encryptor = rijndeal.CreateEncryptor(rijndeal.Key, rijndeal.IV);
      using var fs = new FileStream(targetFile, FileMode.Create);

      //write to Filestream
      using (CryptoStream cs = new CryptoStream(fs, encryptor, CryptoStreamMode.Write))
      using (StreamWriter sw = new StreamWriter(cs))
      {
         sw.Write(someString);
      }
   }
}

static string DecryptFile()
{
   using (var rijndeal = new RijndaelManaged { Key = Convert.FromBase64String(key), IV = Convert.FromBase64String(iv) })
   {

      var encryptor = rijndeal.CreateDecryptor(rijndeal.Key, rijndeal.IV);
      using var fs = new FileStream(targetFile, FileMode.Open);
      //read from FileStream
      using (CryptoStream cs = new CryptoStream(fs, encryptor, CryptoStreamMode.Read))
      using (StreamReader sr = new StreamReader(cs))
      {
         return sr.ReadToEnd();
      }
   }
}

/// <summary>
/// Sample creating Key and IV
/// The same Key/IV used to encrypt must be used to decrypt
/// To use the same key/iv for encrypting/decrypting to/from file, persist these somewhere for reuse (this sample creates them on each run) 
/// </summary>
static void GenerateKeyIv()
{
   using (var rijndael = new RijndaelManaged())
   {
      rijndael.GenerateIV();
      rijndael.GenerateKey();

      key = Convert.ToBase64String(rijndael.Key);
      iv = Convert.ToBase64String(rijndael.IV);
   }
}