本帖最后由 徐佳颖 于 2022-4-15 18:33 编辑
一、3DES加密算法简析: 3DES,也称为 3DESede 或 TripleDES,是三重数据加密算法,相当于是对每个数据库应用三次DES的对称加密算法。 由于DES密码长度容易被暴力破解,所以3DES算法通过对DES算法进行改进,增加DES的密钥长度来避免类似的攻击,针对每个数据块进行三次DES加密;因此,3DES加密算法并非什么新的加密算法,是DES的一个更安全的变形,它以DES为基本模块,通过组合分组方法设计出分组加密算法。 3DES是DES向AES过渡的加密算法,它使用2个或者3个56位的密钥对数据进行三次加密。相比DES,3DES因密钥长度变长,安全性有所提高,但其处理速度不高。因此又出现了AES加密算法,AES较于3DES速度更快、安全性更高。
二、运行过程: 1.创建三个文件夹,如图1所示(可以仅创建用于存放原文的文件夹): inFile.txt:用于存放需要加密的原文。 outFile.txt:用于存放通过3DES加密inFile.txt后的密文。 finalFile.txt:用于存放通过3DES解密outFile.txt后的译文。 2.运行程序。 注:获取文件名方式如下: - string FileName = @"C:\Users\winni\Desktop" + Console.ReadLine() + ".txt";
复制代码 即获得此电脑桌面某txt文件夹,只需在程序运行时输入.txt文件的名字即可。 按照上述方式输入文件名,如图2所示: 3.查看结果。 打开第1步中创建的三个文件夹,效果如图3所示: 4.更多运行结果。 ①只创建存放原文(test1.txt)的文件夹的情况: ②运行程序: ③将自动生成test2(存放密文)、test3(存放译文)的txt: ④结果如下:
三、思路: 1.分析TripleDES_类:类中给出了该类的属性、两种构造函数、string类加/解密方法、byte[]数组加/解密方法、文件加/解密方法(以及加/解密所需的获得密钥、获得初始向量的方法)。 2.由于本次编写程序的目的是达到加密、解密文件,故主要分析类中的以下方法: - public void Encrypt(string inFileName, string outFileName){}
- public void Decrypt(string inFileName, string outFileName){}
复制代码 第一个为文件的加密方法函数,所含参数1为待加密文件的路径,参数2为待加密后文件的输出路径。 - /// <summary>
- /// 加密方法File to File
- /// </summary>
- /// <param name="inFileName">待加密文件的路径</param>
- /// <param name="outFileName">待加密后文件的输出路径</param>
- public void Encrypt(string inFileName, string outFileName)
- {
- try
- {
- /*使用FileStream类表示文件读写流*/
- /*FileStream类构造函数
- * 参数1:指定路径
- * 参数2:创建模式 ->Open:打开现有文件;OpenOrCreate:打开一个文件,若不存在则创建一个新的文件。
- * 参数3:读/写权限 ->Read:读取访问权限;Write:写入访问权限*/
- FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
- FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write);
-
- fout.SetLength(0); //清空文件,设置fout的长度为0
- mydes.Key = GetLegalKey(); //获取密钥
- mydes.IV = GetLegalIV(); //获取初始化向量
- byte[] bin = new byte[100]; //暂时存放fin中获取的数据
- long rdlen = 0; //初始读入长度为0
- long totlen = fin.Length; //fin的长度
- int len;
- ICryptoTransform encrypto = mydes.CreateEncryptor(); //创建对称加密器对象
- CryptoStream cs = new CryptoStream(fout, encrypto, CryptoStreamMode.Write); //将数据流(fout)链接到加密转换的流(encrypto)
- while (rdlen < totlen)
- {
- len = fin.Read(bin, 0, 100); //从流(fin)中读取字节块并将该数据(bin)写入给定缓冲区中
- cs.Write(bin, 0, len); //将一个字节序列(bin)写入当前 CryptoStream(cs),并将流中的当前位置提升写入的字节数
- rdlen = rdlen + len; //读入长度+len
- }
- /*关闭流*/
- cs.Close();
- fout.Close();
- fin.Close();
- }
- catch (Exception ex)
- {
- throw new Exception("在文件加密的时候出现错误!错误提示: " + ex.Message);
- }
- }
复制代码 第二个为文件的解密方法函数,所含参数1为待解密文件的路径,参数2为待解密后文件的输出路径。(具体解析同上)
3.由上述分析可知,应提供待加密文件、待加密后文件输出、待解密文件、待解密后文件输出的路径。故可以通过Console.Readline()获取文件路径。 4.最后,将获取的文件路径传入函数执行即可。
四、源代码【仅包含主程序代码,引用了TripleDES_类】: - using System;
- namespace _3DES
- {
- class Program
- {
- static void Main(string[] args)
- {
- string cokey = "tkGGRmBErvc=";
- TripleDES_ tri = new TripleDES_(cokey);
- Console.Write("请输入此桌面上需要加密的文件名:");
- string inFileName = @"C:\Users\winni\Desktop" + Console.ReadLine() + ".txt";
- Console.Write("请输入加密后存放的文件名:");
- string outFileName = @"C:\Users\winni\Desktop" + Console.ReadLine() + ".txt";
- Console.Write("请输入解密后存放的文件名:");
- string finalFileName = @"C:\Users\winni\Desktop" + Console.ReadLine() + ".txt";
- tri.Encrypt(inFileName, outFileName);
- tri.Decrypt(outFileName, finalFileName);
- }
- }
- }
复制代码
|