|
本帖最后由 1班1号原野 于 2022-4-16 15:16 编辑
1.我的认识:3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法。以下代码为DES加密解密算法,里面包含了对txt文本文件的加密和解密,c#类封装的DES加密解密,可以使用默认秘钥进行加密、解密,也可以自定义秘钥进行加密、解密,调用简单方便。主要用于私人重要的或者隐私文件进行加解密,考虑数据安全,防止数据泄漏。2.代码部分:以下为一些加密、解密以及获得密钥、对称加密类的构造函数的方法:
- /// 三重DES
- public class TripleDES_
- {
- private TripleDES mydes;
- public string Key;
- public string IV;
- /// 对称加密类的构造函数
- public TripleDES_(string key)
- {
- mydes = new TripleDESCryptoServiceProvider();
- Key = key;
- IV = "#$^%&&*Yisifhsfjsljfslhgosdshf26382837sdfjskhf97(*&(*";
- }
- /// 对称加密类的构造函数
- public TripleDES_(string key, string iv)
- {
- mydes = new TripleDESCryptoServiceProvider();
- Key = key;
- IV = iv;
- }
- /// 获得密钥
- /// <returns>密钥</returns>
- private byte[] GetLegalKey()
- {
- string sTemp = Key;
- mydes.GenerateKey();
- byte[] bytTemp = mydes.Key;
- int KeyLength = bytTemp.Length;
- if (sTemp.Length > KeyLength)
- sTemp = sTemp.Substring(0, KeyLength);
- else if (sTemp.Length < KeyLength)
- sTemp = sTemp.PadRight(KeyLength, ' ');
- return ASCIIEncoding.ASCII.GetBytes(sTemp);
- }
- /// 获得初始向量IV
- /// <returns>初试向量IV</returns>
- private byte[] GetLegalIV()
- {
- string sTemp = IV;
- mydes.GenerateIV();
- byte[] bytTemp = mydes.IV;
- int IVLength = bytTemp.Length;
- if (sTemp.Length > IVLength)
- sTemp = sTemp.Substring(0, IVLength);
- else if (sTemp.Length < IVLength)
- sTemp = sTemp.PadRight(IVLength, ' ');
- return ASCIIEncoding.ASCII.GetBytes(sTemp);
- }
- /// 加密方法
- /// <param name="Source">待加密的串</param>
- /// <returns>经过加密的串</returns>
- public string Encrypt(string Source)
- {
- try
- {
- byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
- MemoryStream ms = new MemoryStream();
- mydes.Key = GetLegalKey();
- mydes.IV = GetLegalIV();
- ICryptoTransform encrypto = mydes.CreateEncryptor();
- CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
- cs.Write(bytIn, 0, bytIn.Length);
- cs.FlushFinalBlock();
- ms.Close();
- byte[] bytOut = ms.ToArray();
- return Convert.ToBase64String(bytOut);
- }
- catch (Exception ex)
- {
- throw new Exception("在文件加密的时候出现错误!错误提示: " + ex.Message);
- }
- }
- /// 解密方法
- /// <param name="Source">待解密的串</param>
- /// <returns>经过解密的串</returns>
- public string Decrypt(string Source)
- {
- try
- {
- byte[] bytIn = Convert.FromBase64String(Source);
- MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
- mydes.Key = GetLegalKey();
- mydes.IV = GetLegalIV();
- ICryptoTransform encrypto = mydes.CreateDecryptor();
- CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
- StreamReader sr = new StreamReader(cs);
- return sr.ReadToEnd();
- }
- catch (Exception ex)
- {
- throw new Exception("在文件解密的时候出现错误!错误提示: " + ex.Message);
- }
- }
- /// 加密方法byte[] to byte[]
- /// <param name="Source">待加密的byte数组</param>
- /// <returns>经过加密的byte数组</returns>
- public byte[] Encrypt(byte[] Source)
- {
- try
- {
- byte[] bytIn = Source;
- MemoryStream ms = new MemoryStream();
- mydes.Key = GetLegalKey();
- mydes.IV = GetLegalIV();
- ICryptoTransform encrypto = mydes.CreateEncryptor();
- CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
- cs.Write(bytIn, 0, bytIn.Length);
- cs.FlushFinalBlock();
- ms.Close();
- byte[] bytOut = ms.ToArray();
- return bytOut;
- }
- catch (Exception ex)
- {
- throw new Exception("在文件加密的时候出现错误!错误提示: " + ex.Message);
- }
- }
- /// 解密方法byte[] to byte[]
- /// <param name="Source">待解密的byte数组</param>
- /// <returns>经过解密的byte数组</returns>
- public byte[] Decrypt(byte[] Source)
- {
- try
- {
- byte[] bytIn = Source;
- MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
- mydes.Key = GetLegalKey();
- mydes.IV = GetLegalIV();
- ICryptoTransform encrypto = mydes.CreateDecryptor();
- CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
- StreamReader sr = new StreamReader(cs);
- return UTF8Encoding.UTF8.GetBytes(sr.ReadToEnd());
- }
- catch (Exception ex)
- {
- throw new Exception("在文件解密的时候出现错误!错误提示: " + ex.Message);
- }
- }
- /// 加密方法File to File
- /// <param name="inFileName">待加密文件的路径</param>
- /// <param name="outFileName">待加密后文件的输出路径</param>
- public void Encrypt(string inFileName, string outFileName)
- {
- try
- {
- FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
- FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write);
- fout.SetLength(0);
- mydes.Key = GetLegalKey();
- mydes.IV = GetLegalIV();
- byte[] bin = new byte[100];
- long rdlen = 0;
- long totlen = fin.Length;
- int len;
- ICryptoTransform encrypto = mydes.CreateEncryptor();
- CryptoStream cs = new CryptoStream(fout, encrypto, CryptoStreamMode.Write);
- while (rdlen < totlen)
- {
- len = fin.Read(bin, 0, 100);
- cs.Write(bin, 0, len);
- rdlen = rdlen + len;
- }
- cs.Close();
- fout.Close();
- fin.Close();
- }
- catch (Exception ex)
- {
- throw new Exception("在文件加密的时候出现错误!错误提示: " + ex.Message);
- }
- }
- /// 解密方法File to File
- /// <param name="inFileName">待解密文件的路径</param>
- /// <param name="outFileName">待解密后文件的输出路径</param>
- public void Decrypt(string inFileName, string outFileName)
- {
- try
- {
- FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
- FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write);
- fout.SetLength(0);
- byte[] bin = new byte[100];
- long rdlen = 0;
- long totlen = fin.Length;
- int len;
- mydes.Key = GetLegalKey();
- mydes.IV = GetLegalIV();
- ICryptoTransform encrypto = mydes.CreateDecryptor();
- CryptoStream cs = new CryptoStream(fout, encrypto, CryptoStreamMode.Write);
- while (rdlen < totlen)
- {
- len = fin.Read(bin, 0, 100);
- cs.Write(bin, 0, len);
- rdlen = rdlen + len;
- }
- cs.Close();
- fout.Close();
- fin.Close();
- }catch (Exception ex)
- {throw new Exception("在文件解密的时候出现错误!错误提示: " + ex.Message);}}}
复制代码 以下为program:- {class yyyy
- {static void Main(string[] args)
- {string cokey = "cjskcnsi=";
- TripleDES_ yy = new TripleDES_(cokey);
- Console.WriteLine("请输入此桌面上需要加密的文件名:\n");
- string inFileName = @"C:\Users\DELL\Desktop" + Console.ReadLine() + ".txt";
- Console.WriteLine("请输入机密后存放文件的文件名:\n");
- string outFileName = @"C:\Users\DELL\Desktop" + Console.ReadLine() + ".txt";
- Console.WriteLine("请输入解密后存放文件的文件名:\n");
- string finalFileName = @"C:\Users\DELL\Desktop" + Console.ReadLine();
- yy.Encrypt(inFileName, outFileName);
- yy.Decrypt(outFileName, finalFileName);
- }}}
复制代码 3.运行截图:其中1班1号原野1为原文档,1班1号原野2为加密之后的,1班1号原野3为解密之后的
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|