wordpress 换图片地址,徐州企业网站排名优化,建站平台 iis,网站及app开发[作者:张赐荣] 对称加密是一种加密技术#xff0c;它使用相同的密钥来加密和解密数据。换句话说#xff0c;加密者和解密者需要共享同一个密钥#xff0c;才能进行通信。 对称加密的优点是速度快#xff0c;效率高#xff0c;适合大量数据的加密。对称加密的缺点是密钥的管…[作者:张赐荣] 对称加密是一种加密技术它使用相同的密钥来加密和解密数据。换句话说加密者和解密者需要共享同一个密钥才能进行通信。 对称加密的优点是速度快效率高适合大量数据的加密。对称加密的缺点是密钥的管理和分发比较困难如果密钥泄露或被破解那么加密的数据就会失去保密性。 AES是一种高级加密标准它是一种对称加密算法也就是说它使用相同的密钥来加密和解密数据。AES是美国国家标准技术研究所NIST在2001年选定的一种加密算法用于替代旧的DES算法。AES支持三种不同的密钥长度128位192位和256位。AES的安全性很高目前还没有找到有效的攻击方法。
下面两个函数使用AES加/解密文件。 需要引用 System.Security.Cryptography 命名空间。
// 加密文件 public static async Taskbool EncryptFileAsync (string inputFilePath, string outputFilePath, string key, Actiondouble progressCallback default, CancellationToken cancellationToken default) { HashSetIDisposable disposables new HashSetIDisposable(); 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 Taskbool DecryptFileAsync (string inputFilePath, string outputFilePath, string key, Actiondouble progressCallback default, CancellationToken cancellationToken default) { HashSetIDisposable disposables new HashSetIDisposable(); 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; } } } }