【发布时间】:2020-07-27 09:32:34
【问题描述】:
我想在asp.net core 3.1中上传后加密文件,下载前解密,我可以通过这个教程运行这个问题:link,但是如果文件很大,这个过程非常耗时并且减少了效率。
有什么方法可以只加密文件的一部分吗?
【问题讨论】:
标签: asp.net-core encryption file-encodings
我想在asp.net core 3.1中上传后加密文件,下载前解密,我可以通过这个教程运行这个问题:link,但是如果文件很大,这个过程非常耗时并且减少了效率。
有什么方法可以只加密文件的一部分吗?
【问题讨论】:
标签: asp.net-core encryption file-encodings
您可以使用下面的代码根据块大小在提供的路径处将文件拆分为多个部分:-
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
}
}
}
然后你可以应用上面的代码来加密解密或合并部分,我相信这可行
【讨论】:
补充:- 您可以使用此处的二进制序列化链接:-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;
}
}
}
}
【讨论】: