• 自己写的文本文件加密器


    昨天搞明白了编码的问题后,就开始写这个有些实用价值的东西。
    这个软件实现了文本文件的TripeDES的加密(其它的对称加密是类似的)
    学习这个的朋友可以参照一下,希望对你们有帮助。
    我不是专门写软件的,更不是软件专业。
    说它有用也好,没用也罢。只是兴趣,此前不至空虚罢了。
    下面是源程序:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

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


    namespace TripleDES
    {
        public partial class TdesEncryptExample : Form
        {
            #region Windows 窗体设计器生成的代码

            /// <summary>
            /// 设计器支持所需的方法 - 不要
            /// 使用代码编辑器修改此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {
                System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TdesEncryptExample));
                this.label1 = new System.Windows.Forms.Label();
                this.label2 = new System.Windows.Forms.Label();
                this.txtKey = new System.Windows.Forms.TextBox();
                this.btnFun = new System.Windows.Forms.Button();
                this.linkLabel1 = new System.Windows.Forms.LinkLabel();
                this.label4 = new System.Windows.Forms.Label();
                this.label5 = new System.Windows.Forms.Label();
                this.txtFilePath = new System.Windows.Forms.TextBox();
                this.btnScan = new System.Windows.Forms.Button();
                this.btnExit = new System.Windows.Forms.Button();
                this.label3 = new System.Windows.Forms.Label();
                this.cmbPasswordHelp = new System.Windows.Forms.ComboBox();
                this.statusStrip1 = new System.Windows.Forms.StatusStrip();
                this.tsslable = new System.Windows.Forms.ToolStripStatusLabel();
                this.statusStrip1.SuspendLayout();
                this.SuspendLayout();
                //
                // label1
                //
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(25, 37);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(47, 12);
                this.label1.TabIndex = 0;
                this.label1.Text = "源文件:";
                //
                // label2
                //
                this.label2.AutoSize = true;
                this.label2.Location = new System.Drawing.Point(25, 108);
                this.label2.Name = "label2";
                this.label2.Size = new System.Drawing.Size(35, 12);
                this.label2.TabIndex = 0;
                this.label2.Text = "密码:";
                //
                // txtKey
                //
                this.txtKey.ImeMode = System.Windows.Forms.ImeMode.On;
                this.txtKey.Location = new System.Drawing.Point(89, 105);
                this.txtKey.Name = "txtKey";
                this.txtKey.Size = new System.Drawing.Size(180, 21);
                this.txtKey.TabIndex = 2;
                this.txtKey.UseSystemPasswordChar = true;
                this.txtKey.MouseLeave += new System.EventHandler(this.txtKey_MouseLeave);
                this.txtKey.MouseEnter += new System.EventHandler(this.txtKey_MouseEnter);
                //
                // btnFun
                //
                this.btnFun.Location = new System.Drawing.Point(168, 168);
                this.btnFun.Name = "btnFun";
                this.btnFun.Size = new System.Drawing.Size(72, 23);
                this.btnFun.TabIndex = 4;
                this.btnFun.Text = "操作";
                this.btnFun.UseVisualStyleBackColor = true;
                this.btnFun.Click += new System.EventHandler(this.btnFun_Click);
                //
                // linkLabel1
                //
                this.linkLabel1.AutoSize = true;
                this.linkLabel1.Location = new System.Drawing.Point(306, 217);
                this.linkLabel1.Name = "linkLabel1";
                this.linkLabel1.Size = new System.Drawing.Size(41, 12);
                this.linkLabel1.TabIndex = 6;
                this.linkLabel1.TabStop = true;
                this.linkLabel1.Text = "夏阳港";
                this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
                //
                // label4
                //
                this.label4.AutoSize = true;
                this.label4.Location = new System.Drawing.Point(283, 217);
                this.label4.Name = "label4";
                this.label4.Size = new System.Drawing.Size(17, 12);
                this.label4.TabIndex = 6;
                this.label4.Text = "by";
                //
                // label5
                //
                this.label5.AutoSize = true;
                this.label5.Location = new System.Drawing.Point(298, 112);
                this.label5.Name = "label5";
                this.label5.Size = new System.Drawing.Size(125, 12);
                this.label5.TabIndex = 7;
                this.label5.Text = "(密码长度为6到24位)";
                //
                // txtFilePath
                //
                this.txtFilePath.Location = new System.Drawing.Point(89, 34);
                this.txtFilePath.Name = "txtFilePath";
                this.txtFilePath.Size = new System.Drawing.Size(334, 21);
                this.txtFilePath.TabIndex = 0;
                this.txtFilePath.MouseLeave += new System.EventHandler(this.txtFilePath_MouseLeave);
                this.txtFilePath.MouseEnter += new System.EventHandler(this.txtFilePath_MouseEnter);
                this.txtFilePath.TextChanged += new System.EventHandler(this.txtFilePath_TextChanged);
                //
                // btnScan
                //
                this.btnScan.Location = new System.Drawing.Point(368, 66);
                this.btnScan.Name = "btnScan";
                this.btnScan.Size = new System.Drawing.Size(55, 23);
                this.btnScan.TabIndex = 3;
                this.btnScan.Text = "浏览";
                this.btnScan.UseVisualStyleBackColor = true;
                this.btnScan.Click += new System.EventHandler(this.btnScan_Click);
                //
                // btnExit
                //
                this.btnExit.Location = new System.Drawing.Point(262, 168);
                this.btnExit.Name = "btnExit";
                this.btnExit.Size = new System.Drawing.Size(72, 23);
                this.btnExit.TabIndex = 5;
                this.btnExit.Text = "退出";
                this.btnExit.UseVisualStyleBackColor = true;
                this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
                //
                // label3
                //
                this.label3.AutoSize = true;
                this.label3.Location = new System.Drawing.Point(25, 72);
                this.label3.Name = "label3";
                this.label3.Size = new System.Drawing.Size(59, 12);
                this.label3.TabIndex = 0;
                this.label3.Text = "密码提示:";
                //
                // cmbPasswordHelp
                //
                this.cmbPasswordHelp.FormattingEnabled = true;
                this.cmbPasswordHelp.Items.AddRange(new object[] {
                "我的爸爸的名字?",
                "我的妈妈的名字?",
                "我最喜欢的小狗叫什么?",
                "我在哪所学校上的高中?"});
                this.cmbPasswordHelp.Location = new System.Drawing.Point(89, 69);
                this.cmbPasswordHelp.Name = "cmbPasswordHelp";
                this.cmbPasswordHelp.Size = new System.Drawing.Size(240, 20);
                this.cmbPasswordHelp.TabIndex = 1;
                this.cmbPasswordHelp.MouseEnter += new System.EventHandler(this.cmbPasswordHelp_MouseEnter);
                this.cmbPasswordHelp.MouseLeave += new System.EventHandler(this.cmbPasswordHelp_MouseLeave);
                //
                // statusStrip1
                //
                this.statusStrip1.AutoSize = false;
                this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
                this.tsslable});
                this.statusStrip1.Location = new System.Drawing.Point(0, 242);
                this.statusStrip1.Name = "statusStrip1";
                this.statusStrip1.ShowItemToolTips = true;
                this.statusStrip1.Size = new System.Drawing.Size(474, 22);
                this.statusStrip1.TabIndex = 12;
                this.statusStrip1.Text = "哈 哈 ";
                //
                // tsslable
                //
                this.tsslable.AutoSize = false;
                this.tsslable.Name = "tsslable";
                this.tsslable.Size = new System.Drawing.Size(450, 17);
                this.tsslable.Text = "小朋";
                //
                // TdesEncryptExample
                //
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(474, 264);
                this.Controls.Add(this.statusStrip1);
                this.Controls.Add(this.cmbPasswordHelp);
                this.Controls.Add(this.btnExit);
                this.Controls.Add(this.btnScan);
                this.Controls.Add(this.txtFilePath);
                this.Controls.Add(this.label5);
                this.Controls.Add(this.label4);
                this.Controls.Add(this.linkLabel1);
                this.Controls.Add(this.btnFun);
                this.Controls.Add(this.txtKey);
                this.Controls.Add(this.label3);
                this.Controls.Add(this.label2);
                this.Controls.Add(this.label1);
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
                this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
                this.MaximizeBox = false;
                this.Name = "TdesEncryptExample";
                this.Text = "文本文件加密器";
                this.Load += new System.EventHandler(this.TdesEncryptExample_Load);
                this.statusStrip1.ResumeLayout(false);
                this.statusStrip1.PerformLayout();
                this.ResumeLayout(false);
                this.PerformLayout();

            }
            private System.Windows.Forms.Label label1;
            private System.Windows.Forms.Label label2;
            private System.Windows.Forms.TextBox txtKey;
            private System.Windows.Forms.Button btnFun;
            private System.Windows.Forms.LinkLabel linkLabel1;
            private System.Windows.Forms.Label label4;
            private System.Windows.Forms.Label label5;

            #endregion


            public TdesEncryptExample()
            {
                InitializeComponent();
            }

            #region 参数声明
            private TripleDESCryptoServiceProvider crypt = null;
            private bool IsToEncrypt = true;    //指示是进行加密还是解密。
            private byte[] key;
            private byte[] IV;
            private string strMain = "本软件用于对文件文件(.txt)的加密解密";

            #endregion

            private void TdesEncryptExample_Load(object sender, EventArgs e)
            {
                crypt = new TripleDESCryptoServiceProvider();
                key = new byte[24];
                IV = new byte[8];
                tsslable.Text = strMain;
            }

            private string EncryptText(string str, byte[] Key, byte[] IV)
            {
                try
                {
                    //创建一个内存流。
                    MemoryStream memoryStream = new MemoryStream();

                    ICryptoTransform transToBase64 = new ToBase64Transform();
                    CryptoStream csEncode = new CryptoStream(memoryStream,
                        transToBase64, CryptoStreamMode.Write);

                    //使用传递的私钥和IV创建加密流。
                    CryptoStream cryptoStream = new CryptoStream(csEncode,
                        crypt.CreateEncryptor(Key, IV),
                        CryptoStreamMode.Write);

                    StreamWriter w = new StreamWriter(cryptoStream);

                    try
                    {
                        //将字节数组写入加密流,并清除缓冲区
                        w.Write(str);
                        w.Flush();
                        cryptoStream.FlushFinalBlock();

                        //得到加密后的字节数组。
                        byte[] encryptedBytes = memoryStream.ToArray();
                        string encryptedString = Encoding.UTF8.GetString(encryptedBytes);
                        return encryptedString;
                    }
                    catch (CryptographicException err)
                    {
                        throw new Exception("加密出错:" + err.Message);
                    }
                    finally
                    {
                        cryptoStream.Close();
                        memoryStream.Close();
                    }
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.Message);
                    return null;
                }
            }

            private string DecryptText(string ToDecryptString, byte[] Key, byte[] IV)
            {
                byte[] ToDecryptBytes=Encoding.UTF8.GetBytes(ToDecryptString);

                //根据加密后的字节数组创建一个内存流。
                MemoryStream memoryStream = new MemoryStream(ToDecryptBytes);

                //Transform string from database64;
                ICryptoTransform transformFromBase64 = new FromBase64Transform();
                CryptoStream csDecode = new CryptoStream(memoryStream,
                    transformFromBase64, CryptoStreamMode.Read);

                //使用传递的私钥、IV和内存流创建解密流。
                CryptoStream cryptoStream = new CryptoStream(csDecode,
                    crypt.CreateDecryptor(Key, IV),CryptoStreamMode.Read);

                StreamReader sr = new StreamReader(cryptoStream);

                try
                {
                    //得到解密后的字符串。
                    string decryptedString = sr.ReadToEnd();
                    return decryptedString;
                }
                catch (CryptographicException err)
                {
                    throw new Exception("解密出错:" + err.Message);
                }
                finally
                {
                    sr.Close();
                    cryptoStream.Close();
                    memoryStream.Close();
                }
            }

            private void SetKeyAndIV(string str)
            {
                //验证密码的可用性.
                if (str.Length == 0)
                {
                    throw new Exception("密码为空。");
                }
                if (str.Length < 6)
                {
                    throw new Exception("密码设置太短。");
                }
                if (str.Length > 24)
                {
                    throw new Exception("密码设置太长。");
                }

                byte[] temp = Encoding.UTF8.GetBytes(str);
                int len = temp.Length;
                for (int i = 0; i < len; i++)
                {
                    key[23 - i] = temp[i];
                }

                //填满其余值。
                for (int i = len; i < 24; i++)
                {
                    key[23 - i] = (byte)i;
                }

                IV = new byte[8];
                for (int i = 0; i < 8; i++)
                {
                    IV[i] = key[i * 3];
                }
            }

            private void btnFun_Click(object sender, EventArgs e)
            {
                string strPath = txtFilePath.Text;
                string saveFilePath;
                string FileName;

                if (strPath == "")
                {
                    MessageBox.Show("源文件为空!", "提示", MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation);
                    return;
                }
                if (File.Exists(strPath) == false)
                {
                    MessageBox.Show("源文件不存在!", "提示", MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation);
                    return;
                }

                if (IsTxtFile(strPath)==false)
                {
                    MessageBox.Show("本程序只能加密解密文本文件!","提示",
                        MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
                    return;
                }

                int i1 = strPath.LastIndexOf('.');
                int i2 = strPath.LastIndexOf('\\');
                saveFilePath = strPath.Substring(0, i2);
                FileName = strPath.Substring(i2 + 1, i1 - i2 - 1);

                if (IsToEncrypt == true)
                {
                    try
                    {
                        SetKeyAndIV(txtKey.Text);
                    }
                    catch (Exception er)
                    {
                        MessageBox.Show("对不起,您的" + er.Message, "提示",
                            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }

                    try
                    {
                        //读入加密数据
                        FileStream fs = new FileStream(txtFilePath.Text, FileMode.Open, FileAccess.Read);
                        StreamReader sr = new StreamReader(fs, Encoding.Default);
                        string strToEncrypt = sr.ReadToEnd();
                        sr.Close();
                        fs.Close();

                        string stringEncrypted = EncryptText(strToEncrypt, key, IV);

                        FileName = FunOfFileName(FileName);
                        string strNewFilename = saveFilePath + "\\" + FileName + "-加密文本.txt";
                        if (File.Exists(strNewFilename))
                        {
                            if (MessageBox.Show("文件\"" + FileName + "-加密文本.txt\"在当前目录下己存在,是否替换?",
                                "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
                            {
                                return;
                            }
                        }

                        FileStream fs2 = new FileStream(saveFilePath + "\\" + FileName + "-加密文本.txt",
                            FileMode.Create, FileAccess.Write);
                        StreamWriter sw = new StreamWriter(fs2);
                        sw.WriteLine("密码提示:" + (cmbPasswordHelp.Text == "" ? "无" : cmbPasswordHelp.Text));
                        sw.Write(stringEncrypted);
                        sw.Flush();
                        sw.Close();
                        fs2.Close();

                        MessageBox.Show("恭喜文件加密成功,加密文档己存于加密文件的同一个目录下。",
                            "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    catch (Exception err)
                    {
                        MessageBox.Show(err.Message);
                        return;
                    }
                }

                else
                {
                    //-------------------------------执行解密操作
                    string stringDecrypted;
                    try
                    {
                        SetKeyAndIV(txtKey.Text);

                        //读取加密string.
                        FileStream fs = new FileStream(strPath,
                            FileMode.Open, FileAccess.Read);
                        StreamReader sr = new StreamReader(fs);
                        sr.ReadLine();
                        string stringToDecrypt = sr.ReadToEnd();
                        sr.Close();
                        fs.Close();
                        stringDecrypted = DecryptText(stringToDecrypt, key, IV);
                    }
                    catch
                    {
                        MessageBox.Show("对不起,您的密码不正确。",
                            "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }

                    try
                    {
                        FileName = FunOfFileName(FileName);
                        string strNewFilename = saveFilePath + "\\" + FileName + "-解密文本.txt";
                        if (File.Exists(strNewFilename))
                        {
                            if (MessageBox.Show("文件\"" + FileName + "-解密文本.txt\"在当前目录下己存在,是否替换?",
                                "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
                            {
                                return;
                            }
                        }
                        FileStream fs = new FileStream(strNewFilename,
                         FileMode.Create, FileAccess.Write);
                        StreamWriter sw = new StreamWriter(fs);
                        sw.Write(stringDecrypted);
                        sw.Flush();
                        sw.Close();
                        fs.Close();
                    }

                    catch (Exception err)
                    {
                        MessageBox.Show(err.Message, "提示",
                            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }

                    MessageBox.Show("恭喜文件解密成功,解密文档己存于加密文件的同一个目录下。",
                        "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
            }

            private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
            {
                Process.Start("http://shyanye.cnblogs.com/");
            }

            private void btnScan_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "文本文件(.txt)|*.txt";
                DialogResult temp=openFileDialog.ShowDialog();
                if (temp == DialogResult.OK)
                {
                    txtFilePath.Text = openFileDialog.FileName;
                }
            }

            private void txtFilePath_TextChanged(object sender, EventArgs e)
            {
                if (File.Exists(txtFilePath.Text) == true)
                {
                    //不是文件文件则直接返回
                    if (IsTxtFile(txtFilePath.Text) == false)
                    {
                        return;
                    }

                    FileStream fs = new FileStream(txtFilePath.Text,
                        FileMode.Open, FileAccess.Read);
                    StreamReader sr = new StreamReader(fs);
                    string str = sr.ReadLine();
                    sr.Close();
                    fs.Close();

                    try
                    {
                        //只有前五个字条是下列才认为是进行解密操作
                        if (str.Substring(0, 5) == "密码提示:")
                        {
                            //是执行解密算法
                            cmbPasswordHelp.Text = str.Substring(5);
                            cmbPasswordHelp.Enabled = false;
                            IsToEncrypt = false;
                            return;
                        }
                        throw new Exception();
                    }
                    catch
                    {
                        //是执行加密算法
                        cmbPasswordHelp.Text = "";
                        cmbPasswordHelp.Enabled = true;
                        IsToEncrypt = true;
                    }
                   

                }
            }

            private bool IsTxtFile(string strPath)
            {
                try
                {
                    int i = strPath.LastIndexOf('.');
                    string fileType = strPath.Substring(i + 1, 3);
                    fileType = fileType.ToLowerInvariant();
                    if (fileType == "txt")
                    {
                        return true;
                    }
                    return false;
                }
                catch
                {
                    return false;
                }
            }

            private string FunOfFileName(string fileName)
            {
                try
                {
                    int i = fileName.LastIndexOf('-');
                    string str = fileName.Substring(i + 1);
                    string str2 = fileName.Substring(0, i);
                    if (str == "加密文本" || str == "解密文本")
                    {
                        return str2;
                    }
                    return fileName;
                }
                catch
                {
                    return fileName;
                }
            }

            private void btnExit_Click(object sender, EventArgs e)
            {
                this.Close();
            }

            private void txtFilePath_MouseEnter(object sender, EventArgs e)
            {
                tsslable.Text = "输入要加密或解密文本的位置";
            }

            private void txtFilePath_MouseLeave(object sender, EventArgs e)
            {
                tsslable.Text = strMain;
            }

            private void cmbPasswordHelp_MouseEnter(object sender, EventArgs e)
            {
                tsslable.Text = "可以保留一个密码提示,以防您将来忘记密码";
            }

            private void cmbPasswordHelp_MouseLeave(object sender, EventArgs e)
            {
                tsslable.Text = strMain;
            }

            private void txtKey_MouseEnter(object sender, EventArgs e)
            {
                tsslable.Text = "在此输入您的密码";
            }

            private void txtKey_MouseLeave(object sender, EventArgs e)
            {
                tsslable.Text = strMain;
            }
        }
    }


    下载
  • 相关阅读:
    使用ParseExact方法将字符串转换为日期格式
    Windows 备用数据流(ADS)的妙用___转载
    ms17_010利用复现(32位)
    将手机号设置为空号
    PowerShell批量创建文件夹
    让程序显示运行时间
    使用Sleep方法延迟时间
    使用TimeSpan对象获取时间间隔
    DateTime小综合
    DDMS介绍
  • 原文地址:https://www.cnblogs.com/shyanye/p/1077969.html
Copyright © 2020-2023  润新知