【问题标题】:encrypt and decrypt part of file content in asp.net core在 asp.net core 中加密和解密部分文件内容
【发布时间】:2020-07-27 09:32:34
【问题描述】:

我想在asp.net core 3.1中上传后加密文件,下载前解密,我可以通过这个教程运行这个问题:link,但是如果文件很大,这个过程非常耗时并且减少了效率。

有什么方法可以只加密文件的一部分吗?

【问题讨论】:

    标签: asp.net-core encryption file-encodings


    【解决方案1】:

    您可以使用下面的代码根据块大小在提供的路径处将文件拆分为多个部分:-

    public static void SplitFile(string inputFile, int chunkSize, string path)
    {
        const int BUFFER_SIZE = 20 * 1024;
        byte[] buffer = new byte[BUFFER_SIZE];
    
        using (Stream input = File.OpenRead(inputFile))
        {
            int index = 0;
            while (input.Position < input.Length)
            {
                using (Stream output = File.Create(path + "\\" + index))
                {
                    int remaining = chunkSize, bytesRead;
                    while (remaining > 0 && (bytesRead = input.Read(buffer, 0,
                            Math.Min(remaining, BUFFER_SIZE))) > 0)
                    {
                        output.Write(buffer, 0, bytesRead);
                        remaining -= bytesRead;
                    }
                }
                index++;
                Thread.Sleep(500); // experimental; perhaps try it
            }
        }
    }
    

    然后你可以应用上面的代码来加密解密或合并部分,我相信这可行

    【讨论】:

      【解决方案2】:

      补充:- 您可以使用此处的二进制序列化链接:-Encrypt .NET binary serialization stream

      当然,您可以这样做,但您需要了解 Dotnet 中可用的一些加密/解密类或算法,或者您可以从这里获得帮助:-

          class TestAESENC{
          public static string EncryptString(string text, string keyString)
              {
                  var key = Encoding.UTF8.GetBytes(keyString);
                  using (var aesAlg = Aes.Create())
                  {
                      using (var encryptor = aesAlg.CreateEncryptor(key, aesAlg.IV))
                      {
                          using (var msEncrypt = new MemoryStream())
                          {
                              using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                              using (var swEncrypt = new StreamWriter(csEncrypt))
                              {
                                  swEncrypt.Write(text);
                              }
                              var iv = aesAlg.IV;
                              var decryptedContent = msEncrypt.ToArray();
                              var result = new byte[iv.Length + decryptedContent.Length];
                              Buffer.BlockCopy(iv, 0, result, 0, iv.Length);
                              Buffer.BlockCopy(decryptedContent, 0, result, iv.Length, decryptedContent.Length);
                              return Convert.ToBase64String(result);
                          }
                      }
                  }
              }
      
              public static string DecryptString(string cipherText, string keyString)
              {
                  var fullCipher = Convert.FromBase64String(cipherText);
                  var iv = new byte[16];
                  var cipher = new byte[16];
                  Buffer.BlockCopy(fullCipher, 0, iv, 0, iv.Length);
                  Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, iv.Length);
                  var key = Encoding.UTF8.GetBytes(keyString);
                  using (var aesAlg = Aes.Create())
                  {
                      using (var decryptor = aesAlg.CreateDecryptor(key, iv))
                      {
                          string result;
                          using (var msDecrypt = new MemoryStream(cipher))
                          {
                              using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                              {
                                  using (var srDecrypt = new StreamReader(csDecrypt))
                                  {
                                      result = srDecrypt.ReadToEnd();
                                  }
                              }
                          }
      
                          return result;
                      }
                  }
              }
      }
      

      【讨论】:

      • 感谢您的回复 我不明白这段代码如何加密文件的一部分。能给我解释一下吗?
      • 这些是采用字符串和加密/解密相同的简单方法,取决于您如何找到要加密的文件的分区,顺便说一句,它是文本文件还是二进制文件?
      • 顺便说一句,我的问题是如何分离文件的一部分并在加密后重新创建一个集成文件。我的目标是,如果服务器被黑客入侵,黑客将无法访问文件的内容,并且服务器资源将得到正常使用。
      • 您的文件包含什么文本或二进制数据?
      • 任何文件,如pdf、mp4、docx、jpg等
      猜你喜欢
      • 2012-06-19
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多