using System;
using System.IO;
using System.Security.Cryptography;

namespace ConsoleApp_SymmetricalEncryption
{
class Program
{
static void Main(string[] args)
{
SymmetricalEncryption ss = new SymmetricalEncryption();

ss.EncryptFile(@"C:\error.txt", @"C:\error_EncryptFile.txt", ss.Key);
Console.WriteLine("加密成功!");
Console.ReadKey();
ss.DecryptFile(@"C:\error_EncryptFile.txt", @"C:\error_DecryptFile.txt", ss.Key);
Console.WriteLine("解密成功!");
Console.ReadKey();
}
}

/// <summary>
/// 对文件使用对称加密算法
/// </summary>
public class SymmetricalEncryption
{
/* 对称加密:
* 需要发送者和接收者协定一个密钥K,K可以是一个密钥对,但必须是加密密钥和解密密钥之间能够互相推算出来的。
* 常用的对称加密算法中,加密解密共享一个密钥。
* 本例中使用的是同一个密钥;
*
* 非对称加密:
* 有一个密钥对,分别为 公钥、私钥(公钥用来加密,私钥用来解密)
* 私钥永远不需要传递给对方;
*
* 优缺点比较:
* 非对称加密算法复杂,导致加解密速度慢,只适合与数据量小的场合。
* 对称加密解密效率高,系统开销小,适合金星大数据量的加解密。(大文件一般适合使用对称加密)
*/

/// <summary>
/// 随机产生的密钥(也可以自己指定)
/// 【注意:对称加密算法 加密解密用的Key值是相同的(非对称加密才分:公钥和私钥)】
/// </summary>
public string Key = Guid.NewGuid().ToString().Replace("-", "").ToUpper() + Guid.NewGuid().ToString().Replace("-", "").ToUpper();

/// <summary>
/// 缓冲区大小
/// </summary>
private int bufferSize = 128 * 1024;

/// <summary>
/// 密钥salt
/// </summary>
private byte[] salt = { 134, 216, 7, 36, 88, 164, 91, 227, 174, 76, 191, 197, 192, 154, 200, 248 };
//salt用来防止穷举暴力破解(salt是在密钥导出之前在密码末尾引入的随机字节,它使得这类攻击变得非常困难)

/// <summary>
/// 初始化向量
/// </summary>
private byte[] iv = { 134, 216, 7, 36, 88, 164, 91, 227, 174, 76, 191, 197, 192, 154, 200, 248 };
//初始化向量iv起到的也是增强破解难度的作用

/// <summary>
/// 初始化 并返回对称加密算法
/// </summary>
/// <param name="argKey"></param>
/// <param name="argSalt"></param>
/// <returns></returns>
private SymmetricAlgorithm CreateRijindael(string argKey, byte[] argSalt)
{
PasswordDeriveBytes pdb = new PasswordDeriveBytes(argKey, argSalt, "SHA256", 1000);
SymmetricAlgorithm sma = Rijndael.Create();
sma.KeySize = 256;
sma.Key = pdb.GetBytes(32);
sma.Padding = PaddingMode.PKCS7;
return sma;
}

/// <summary>
/// 加密文件
/// </summary>
/// <param name="argInFile">输入文件</param>
/// <param name="argOutFile">输出加密后的文件</param>
/// <param name="argKey">加密用的Key</param>
public void EncryptFile(string argInFile, string argOutFile, string argKey)
{
using (FileStream inFileStream = File.OpenRead(argInFile),
outFileStream = File.Open(argOutFile, FileMode.OpenOrCreate))
using (SymmetricAlgorithm algorithm = CreateRijindael(argKey, salt))
{
algorithm.IV = iv;
using (CryptoStream cryptoStream = new CryptoStream(outFileStream, algorithm.CreateEncryptor(),
CryptoStreamMode.Write))
{
byte[] bytes = new byte[bufferSize];
int readSize = -1;
while ((readSize = inFileStream.Read(bytes, 0, bytes.Length)) != 0)
{
cryptoStream.Write(bytes, 0, readSize);
}
cryptoStream.Flush();
}
}
}

/// <summary>
/// 解密文件
/// </summary>
/// <param name="argInFile">输入待解密的文件</param>
/// <param name="argOutFile">输出解密后的文件</param>
/// <param name="argKey">加密用的Key</param>
public void DecryptFile(string argInFile, string argOutFile, string argKey)
{
try
{
using (FileStream inFileStream = File.OpenRead(argInFile), outFileStream = File.OpenWrite(argOutFile))
using (SymmetricAlgorithm algorithm = CreateRijindael(argKey, salt))
{
algorithm.IV = iv;
using (CryptoStream cryptoStream = new CryptoStream(inFileStream, algorithm.CreateDecryptor(),
CryptoStreamMode.Read))
{
byte[] bytes = new byte[bufferSize];
int readSize = -1;
int numReads = (int)(inFileStream.Length / bufferSize);
int slack = (int)(inFileStream.Length % bufferSize);
for (int i = 0; i < numReads; ++i)
{
readSize = cryptoStream.Read(bytes, 0, bytes.Length);
outFileStream.Write(bytes, 0, readSize);
}
if (slack > 0)
{
readSize = cryptoStream.Read(bytes, 0, (int)slack);
outFileStream.Write(bytes, 0, readSize);
}
outFileStream.Flush();
}
}
}
catch (Exception ex)
{
throw new Exception("解密失败:" + ex.Message);//可能是密钥输入的不正确,或者文件被修改过
}
}

}
}

【.NET】对文件的对称加密的更多相关文章

  1. shell 脚本实现文件对称加密

    前言 之前手机里管理密码的脚本,都是直接编写进纯文本然后进行多次归档及压缩来实现不明文存储,一直觉得不太安全,于是昨天晚上编写脚本实现了简单的文件对称加密. 网上文章都利用 openssl 来进行文件 ...

  2. Linux下OpenSSL加密解密压缩文件(AES加密压缩文件)

    OpenSSL是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库.应用程序.SSL协议库.Openssl实现了SSL协议所需要的大多数算法.下面介绍使用Openssl进行文件的对称 ...

  3. iOS CommonCrypto 对称加密 AES ecb,cbc

    CommonCrypto 为苹果提供的系统加密接口,支持iOS 和 mac 开发: 不仅限于AES加密,提供的接口还支持其他DES,3DES,RC4,BLOWFISH等算法, 本文章主要讨论AES在i ...

  4. [Node.js] 对称加密、公钥加密和RSA

    原文地址:http://www.moye.me/2015/06/14/cryptography_rsa/ 引子 对于加解密,我一直处于一种知其然不知其所以然的状态,项目核心部分并不倚重加解密算法时,可 ...

  5. WCF安全2-非对称加密

    概述: 数字签名和加密依赖于相应的加密算法 自变量:加密前的数据.密钥 因变量:加密后的数据 加密算法分类:根据加密和解密这两种步骤采用的密钥的是否相同进行分类 相同:对称加密 不相同:非对称加密 非 ...

  6. .net 对称加密DESCryptoServiceProvider

    1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...

  7. Java安全之对称加密、非对称加密、数字签名

    原文地址: http://blog.csdn.net/furongkang/article/details/6882039 Java中加密分为两种方式一个是对称加密,另一个是非对称加密.对称加密是因为 ...

  8. 安全HTTPS-全面详解对称加密,非对称加密,数字签名,数字证书和HTTPS【下】

    1.  HTTPS 1.1. 什么是HTTPS HTTPS(HypertextTransfer Protocol Secure)即安全的HTTP.HTTPS的安全基础是安全套接层(Secure Soc ...

  9. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

随机推荐

  1. HDU 1011 Starship Troopers 树形DP 有坑点

    本来是一道很水的树形DP题 设dp[i][j]表示,带着j个人去攻打以节点i为根的子树的最大收益 结果wa了一整晚 原因: 坑点1: 即使这个节点里面没有守卫,你如果想获得这个节点的收益,你还是必须派 ...

  2. bug_ _ java.lang.IllegalArgumentException: pointerIndex out of range 问题的两种解决办法

    ========== 4     如何解决java.lang.IllegalArgumentException: pointerIndex out of range? 今天遇到一个bug:java.l ...

  3. 转-TabHost组件(一)(实现底部菜单导航)

    http://www.cnblogs.com/lichenwei/p/3974009.html 什么是TabHost? TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用wind ...

  4. Win7家庭版开启Administrator管理员帐户的方法

    Win7家庭版开启Administrator管理员帐户的方法 发布时间:2014-11-17 18:30:06来源:系统盒浏览数:2786 很多用户安装好Win7系统第一步就是开启Administra ...

  5. (Delphi) Windows 32 API程序设计目录

    这里所有程序均使用Delphi调用Windows 32 API方式实现,并不是使用VCL已经封装好的类实现的! (一)第一个窗口程序 01 创建第一个窗口.

  6. 转: Ubuntu 安装字体方法

    命令安装:   以微软雅黑字体为例(其他的宋体.黑体等点阵字体都一样的),我们的雅黑字体文件是:Yahei.ttf(放在自己的主目录下)(在widows目录的Fonts目录下找需要的字体)由于我是双系 ...

  7. JAVA中继承时方法的重载(overload)与重写/覆写(override)

    JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就 ...

  8. log4j 缓存

    log4j.appender.A2.bufferedIO=truelog4j.appender.A2.bufferSize=512000

  9. 一机运行多个resin的配置

    对于java应用服务器,常用的一般为tomcat.jboss.resin. 一. 概述 经常会有这种情况: 1.一台服务器上,跑多个java应用 2.网站负载高,需要采用负载均衡(轮询)的方式来解决 ...

  10. 利用python yielding创建协程将异步编程同步化

    转自:http://www.jackyshen.com/2015/05/21/async-operations-in-form-of-sync-programming-with-python-yiel ...