用c#编写一个文件加密器

用c#编写一个文件加密器

用c#编写一个文件加密器

一、加密算法概述

加密算法有对称与非对称,可逆与非可逆之分,使用的场景也非常多,从加密存储、到加密通讯安全。

1、对称加密算法(AES、DES、3DES)
对称加密算法是指加密和解密采用相同的密钥,是可逆的(即可解密)。

AES加密算法是密码学中的高级加密标准,采用的是对称分组密码体制,密钥长度的最少支持为128。AES加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的DES,已经被多方分析且广为全世界使用。

优点:加密速度快
缺点:密钥的传递和保存是一个问题,参与加密和解密的双方使用的密钥是一样的,这样密钥就很容易泄露。


2、非对称加密算法(RSA、DSA、ECC)

非对称加密算法是指加密和解密采用不同的密钥(公钥和私钥),因此非对称加密也叫公钥加密,是可逆的(即可解密)。公钥密码体制根据其所依据的难题一般分为三类:大素数分解问题类、离散对数问题类、椭圆曲线类。

RSA加密算法是基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解极其困难,因此可以将乘积公开作为加密密钥。虽然RSA的安全性一直未能得到理论上的证明,但它经历了各种攻击至今未被完全攻破。

优点:加密和解密的密钥不一致,公钥是可以公开的,只需保证私钥不被泄露即可,这样就密钥的传递变的简单很多,从而降低了被破解的几率。
缺点:加密速度慢

RSA加密算法既可以用来做数据加密,也可以用来数字签名。
--数据加密过程:发送者用公钥加密,接收者用私钥解密(只有拥有私钥的接收者才能解读加密的内容)
--数字签名过程:甲方用私钥加密,乙方用公钥解密(乙方解密成功说明就是甲方加的密,甲方就不可以抵赖)

ECC加密算法是基于椭圆曲线上离散对数计算问题(ECDLP)的ECC算法。ECC算法的数学理论非常深奥和复杂,在工程应用中比较难于实现,但它的单位安全强度相对较高。

用国际上公认的对于ECC算法最有效的攻击方法--Pollard rho方法去破译和攻击ECC算法,它的破译或求解难度基本上是指数级的。正是由于RSA算法和ECC算法这一明显不同,使得ECC算法的单位安全强度高于RSA算法,也就是说,要达到同样的安全强度,ECC算法所需的密钥长度远比RSA算法低。有研究表示160位的椭圆密钥与1024位的RSA密钥安全性相同。在私钥的加密解密速度上,ECC算法比RSA、DSA速度更快。存储空间占用更小。

3、线性散列算法算法(MD5、SHA1、HMAC)

MD5全称是Message-Digest Algorithm 5(信息摘要算法5),单向的算法不可逆(被MD5加密的数据不能被解密)。MD5加密后的数据长度要比加密数据小的多,且长度固定,且加密后的串是唯一的。
适用场景:常用在不可还原的密码存储、信息完整性校验等。
信息完整性校验:典型的应用是对一段信息产生信息摘要,以防止被篡改。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
SHA-1 与 MD5 的比较
SHA-1摘要比MD5摘要长32 位,所以SHA-1对强行攻击有更大的强度,比MD5更安全。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。
在相同的硬件上,SHA-1 的运行速度比 MD5 慢。

4、混合加密

由于以上加密算法都有各自的缺点(RSA加密速度慢、AES密钥存储问题、MD5加密不可逆),因此实际应用时常将几种加密算法混合使用。
例如:RSA+AES:
采用RSA加密AES的密钥,采用AES对数据进行加密,这样集成了两种加密算法的优点,既保证了数据加密的速度,又实现了安全方便的密钥管理。
那么,采用多少位的密钥合适呢?一般来讲密钥长度越长,安全性越高,但是加密速度越慢。所以密钥长度也要合理的选择,一般RSA建议采用1024位的数字,AES建议采用128位即可。

5、Base64
严格意义讲,Base64并不能算是一种加密算法,而是一种编码格式,是网络上最常见的用于传输8bid字节代码的编码方式之一。
Base64编码可用于在HTTP环境下传递较长的标识信息,Base编码不仅不仅比较简单,同时也据有不可读性(编码的数据不会被肉眼直接看到)。

二、DES加密代码

今天我们来演示一下对称加密算法DES

DES全称为Data Encryption Standard,即数据加密标准。1997年数据加密标准DES正式公布,其分组长度为64比特,密钥长度为64比特,其中8比特为奇偶校验位,所以实际长度为56比特。

C#可以使用自带的类库简单的完成DES加密,主要用到MemoryStream、 DESCryptoServiceProvide、 CryptoStream三个类。

Encoding.UTF8.GetBytes:转换为UTF8编码的字节数组
DESCryptoServiceProvide:加密服务提供者类
MemoryStream:内存流
CryptoStream:将数据流连接到加密转换的流
CreateEncryptor(btKey, btIV):使用指定的密钥(btKey)和初始化向量 (btIV) 创建对称加密器对象。

来先看代码

        private byte[] DecryptDES(byte[] decryptbyte, string decryptKey)
        {
            byte[] ret = null;
            try
            {
                using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
                {
                    des.Key = Encoding.UTF8.GetBytes(decryptKey);
                    des.IV = Keys;
                    MemoryStream ms = new System.IO.MemoryStream();
                    using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(decryptbyte, 0, decryptbyte.Length);
                        cs.FlushFinalBlock();
                        cs.Close();
                    }
                    ret = ms.ToArray();
                    ms.Close();

                }
                return ret;

            }
            catch
            {
                return decryptbyte;
            }
        }
        private byte[] EncryptDES(byte[] encryptbyte, string encryptKey)
        {
            byte[] ret = null;
            try
            {
                using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
                {
                    des.Key = Encoding.UTF8.GetBytes(encryptKey);
                    des.IV = Keys;
                    MemoryStream ms = new System.IO.MemoryStream();
                    using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(encryptbyte, 0, encryptbyte.Length);
                        cs.FlushFinalBlock();
                        cs.Close();
                    }
                    ret = ms.ToArray();
                    ms.Close();

                }
                return ret;


            }
            catch
            {
                return encryptbyte;
            }
        }

三、项目源码下载

DesCrypto.zip

{{collectdata}}

网友评论0