网站免费正能量软件手机企业管理app软件
[作者:张赐荣]
对称加密是一种加密技术,它使用相同的密钥来加密和解密数据。换句话说,加密者和解密者需要共享同一个密钥,才能进行通信。
 对称加密的优点是速度快,效率高,适合大量数据的加密。对称加密的缺点是密钥的管理和分发比较困难,如果密钥泄露或被破解,那么加密的数据就会失去保密性。
 AES是一种高级加密标准,它是一种对称加密算法,也就是说,它使用相同的密钥来加密和解密数据。AES是美国国家标准技术研究所(NIST)在2001年选定的一种加密算法,用于替代旧的DES算法。AES支持三种不同的密钥长度:128位,192位和256位。AES的安全性很高,目前还没有找到有效的攻击方法。
下面两个函数使用AES,加/解密文件。
 需要引用 "System.Security.Cryptography" 命名空间。
// 加密文件
         public static async Task<bool> EncryptFileAsync (string inputFilePath, string outputFilePath, string key, Action<double> progressCallback = default, CancellationToken cancellationToken = default)
         {
             HashSet<IDisposable> disposables = new HashSet<IDisposable>();
             try
             {
                 var md5 = MD5.Create();
                 disposables.Add(md5);
                 var md5Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
                 var aes = Aes.Create();
                 disposables.Add(aes);
                 aes.Key = md5Key;
                 var aesEncryptor = aes.CreateEncryptor();
                 disposables.Add(aesEncryptor);
                 var inputStream = File.OpenRead(inputFilePath);
                 disposables.Add(inputStream);
                 var outputStream = File.OpenWrite(outputFilePath);
                 disposables.Add(outputStream);
                 aes.GenerateIV();
                 await outputStream.WriteAsync(aes.IV,0,aes.IV.Length,cancellationToken);
                 var encryptoWriterStream = new CryptoStream(outputStream,aesEncryptor,CryptoStreamMode.Write);
                 disposables.Add(encryptoWriterStream);
                 var buffer = new byte[65536];
                 var readLength = -1;
                 while ((readLength = await inputStream.ReadAsync(buffer,0,buffer.Length,cancellationToken)) > 0)
                 {
                     await encryptoWriterStream.WriteAsync(buffer,0,readLength,cancellationToken);
                     progressCallback?.Invoke(Math.Round(((double)(inputStream.Position +1 - aes.IV.Length) / inputStream.Length) * 100,2));
                 }
                 if (!encryptoWriterStream.HasFlushedFinalBlock)
                 {
                     encryptoWriterStream.FlushFinalBlock();
                     progressCallback?.Invoke(100.00);
                 }
                 return (true);
             }
             catch (Exception ex)
             {
                 return (false);
             }
             finally
             {
                 foreach (var disposableObject in disposables)
                 {
                     try
                     {
                         disposableObject.Dispose();
                     }
                     catch (Exception ex)
                     {
                         continue;
                     }
                 }
             }
         }
// 解密文件
         public static async Task<bool> DecryptFileAsync (string inputFilePath, string outputFilePath, string key, Action<double> progressCallback = default, CancellationToken cancellationToken = default)
         {
             HashSet<IDisposable> disposables = new HashSet<IDisposable>();
             try
             {
                 var md5 = MD5.Create();
                 disposables.Add(md5);
                 var md5Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
                 var inputStream = File.OpenRead(inputFilePath);
                 disposables.Add(inputStream);
                 byte[] iv = new byte[16];
                 await inputStream. ReadAsync(iv,0,iv.Length,cancellationToken);
                 var aes = Aes.Create();
                 disposables.Add(aes);
                 aes.Key = md5Key;
                 aes.IV = iv;
                 var aesDecryptor = aes.CreateDecryptor();
                 disposables.Add(aesDecryptor);
                 var DecryptorReaderStream = new CryptoStream(inputStream,aesDecryptor,CryptoStreamMode.Read);
                 disposables.Add(DecryptorReaderStream);
                 var outputStream = File.OpenWrite(outputFilePath);
                 disposables.Add(outputStream);
                 var buffer = new byte[65536];
                 var readLength = -1;
                 while ((readLength = await DecryptorReaderStream.ReadAsync(buffer,0,buffer.Length,cancellationToken)) > 0)
                 {
                     await outputStream.WriteAsync(buffer,0,readLength,cancellationToken);
                     progressCallback?.Invoke(Math.Round(((double)(inputStream.Position + 1) / inputStream.Length) * 100, 2));
                 }
                 if (!DecryptorReaderStream.HasFlushedFinalBlock)
                 {
                     DecryptorReaderStream.FlushFinalBlock();
                     progressCallback?.Invoke(100.00);
                 }
                 return (true);
             }
             catch (Exception ex)
             {
                 return (false);
             }
             finally
             {
                 foreach (var disposableObject in disposables)
                 {
                     try
                     {
                         disposableObject.Dispose();
                     }
                     catch (Exception ex)
                     {
                         continue;
                     }
                 }
             }
         }
  
