添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

* 加密 與解密, 用於資料保密(在台灣每年合法申請監聽的數量超過1.5萬件, 非法的監聽件數未知, 各位的Skype或LINE的傳訊內容, 或許早就被人看光光)
** AES , DES , TripleDES , RC2 , RSA

* 雜湊 值, 則常用密碼字串儲存, 避免在資料庫裡使用明碼存放密碼, 以防資料庫外洩時, 密碼在第一時間被看光光
** MD5 , SHA1

相關技術:
* System.Security.Cryptography Namespace

*檔案 Encoder.cs

using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace Encoder.Security
    public enum EncoderType
        //可逆編碼(對稱金鑰)
        TripleDES,
        //可逆編碼(非對稱金鑰)
        //不可逆編碼(雜湊值)
        SHA1,
        SHA256,
        SHA384,
        SHA512
    public class Encoder
        public string Key { get; set; }
        public string IV { get; set; }
        /// <summary>
        /// 產生新的KEY
        /// </summary>
        /// <param name="type">編碼器種類</param>
        public void GenerateKey(EncoderType type)
            switch (type)
                //可逆編碼(對稱金鑰)
                case EncoderType.AES:
                    using (AesCryptoServiceProvider csp = new AesCryptoServiceProvider())
                        csp.GenerateIV();
                        IV = Convert.ToBase64String(csp.IV);
                        csp.GenerateKey();
                        Key = Convert.ToBase64String(csp.Key);
                    break;
                case EncoderType.DES:
                    using (DESCryptoServiceProvider csp = new DESCryptoServiceProvider())
                        csp.GenerateIV();
                        IV = Convert.ToBase64String(csp.IV);
                        csp.GenerateKey();
                        Key = Convert.ToBase64String(csp.Key);                        
                    break;
                case EncoderType.RC2:
                    using (RC2CryptoServiceProvider csp = new RC2CryptoServiceProvider())
                        csp.GenerateIV();
                        IV = Convert.ToBase64String(csp.IV);
                        csp.GenerateKey();
                        Key = Convert.ToBase64String(csp.Key);
                    break;
                case EncoderType.TripleDES:
                    using (TripleDESCryptoServiceProvider csp = new TripleDESCryptoServiceProvider())
                        csp.GenerateIV();
                        IV = Convert.ToBase64String(csp.IV);
                        csp.GenerateKey();
                        Key = Convert.ToBase64String(csp.Key);
                    break;
                //可逆編碼(非對稱金鑰)
                case EncoderType.RSA:
                    using (RSACryptoServiceProvider csp = new RSACryptoServiceProvider())
                        IV = "";
                        Key = csp.ToXmlString(true);
                    break;
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="type">編碼器種類</param>  
        /// <param name="encrypt">加密前字串</param>
        /// <returns>加密後字串</returns>
        public string Encrypt(EncoderType type, string encrypt)
            string ret = "";
            byte[] inputByteArray = Encoding.UTF8.GetBytes(encrypt);
            switch (type)
                //可逆編碼(對稱金鑰)
                case EncoderType.AES:
                    using (AesCryptoServiceProvider csp = new AesCryptoServiceProvider())
                        byte[] rgbKey = Convert.FromBase64String(Key);
                        byte[] rgbIV = Convert.FromBase64String(IV);
                        using (MemoryStream ms = new MemoryStream())
                            using (CryptoStream cs = new CryptoStream(ms, csp.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
                                cs.Write(inputByteArray, 0, inputByteArray.Length);
                                cs.FlushFinalBlock();
                                ret = Convert.ToBase64String(ms.ToArray());
                    break;
                case EncoderType.DES:
                    using (DESCryptoServiceProvider csp = new DESCryptoServiceProvider())
                        byte[] rgbKey = Convert.FromBase64String(Key);
                        byte[] rgbIV = Convert.FromBase64String(IV);
                        using (MemoryStream ms = new MemoryStream())
                            using (CryptoStream cs = new CryptoStream(ms, csp.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
                                cs.Write(inputByteArray, 0, inputByteArray.Length);
                                cs.FlushFinalBlock();
                                ret = Convert.ToBase64String(ms.ToArray());
                    break;
                case EncoderType.RC2:
                    using (RC2CryptoServiceProvider csp = new RC2CryptoServiceProvider())
                        byte[] rgbKey = Convert.FromBase64String(Key);
                        byte[] rgbIV = Convert.FromBase64String(IV);
                        using (MemoryStream ms = new MemoryStream())
                            using (CryptoStream cs = new CryptoStream(ms, csp.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
                                cs.Write(inputByteArray, 0, inputByteArray.Length);
                                cs.FlushFinalBlock();
                                ret =  Convert.ToBase64String(ms.ToArray());
                    break;
                case EncoderType.TripleDES:
                    using (TripleDESCryptoServiceProvider csp = new TripleDESCryptoServiceProvider())
                        byte[] rgbKey = Convert.FromBase64String(Key);
                        byte[] rgbIV = Convert.FromBase64String(IV);
                        using (MemoryStream ms = new MemoryStream())
                            using (CryptoStream cs = new CryptoStream(ms, csp.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
                                cs.Write(inputByteArray, 0, inputByteArray.Length);
                                cs.FlushFinalBlock();
                                ret = Convert.ToBase64String(ms.ToArray());
                    break;
                //可逆編碼(非對稱金鑰)
                case EncoderType.RSA:
                    using (RSACryptoServiceProvider csp = new RSACryptoServiceProvider())
                        csp.FromXmlString(Key);
                        ret = Convert.ToBase64String(csp.Encrypt(inputByteArray, false));
                    break;
                //不可逆編碼(雜湊值)
                case EncoderType.MD5:
                    using (MD5CryptoServiceProvider csp = new MD5CryptoServiceProvider())
                        ret = BitConverter.ToString(csp.ComputeHash(inputByteArray)).Replace("-", string.Empty);  
                    break;
                case EncoderType.SHA1:
                    using (SHA1CryptoServiceProvider csp = new SHA1CryptoServiceProvider())
                        ret = BitConverter.ToString(csp.ComputeHash(inputByteArray)).Replace("-", string.Empty);
                    break;
                case EncoderType.SHA256:
                    using (SHA256CryptoServiceProvider csp = new SHA256CryptoServiceProvider())
                        ret = BitConverter.ToString(csp.ComputeHash(inputByteArray)).Replace("-", string.Empty);
                    break;
                case EncoderType.SHA384:
                    using (SHA384CryptoServiceProvider csp = new SHA384CryptoServiceProvider())
                        ret = BitConverter.ToString(csp.ComputeHash(inputByteArray)).Replace("-", string.Empty);
                    break;
                case EncoderType.SHA512:
                    using (SHA512CryptoServiceProvider csp = new SHA512CryptoServiceProvider())
                        ret = BitConverter.ToString(csp.ComputeHash(inputByteArray)).Replace("-", string.Empty);
                    break;
            return ret;
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="type">編碼器種類</param>  
        /// <param name="decrypt">解密前字串</param>
        /// <returns>解密後字串</returns>
        public string Decrypt(EncoderType type, string decrypt)
            string ret = "";
            byte[] inputByteArray = Convert.FromBase64String(decrypt);
            switch (type)
                //可逆編碼(對稱金鑰)
                case EncoderType.AES:
                    using (AesCryptoServiceProvider csp = new AesCryptoServiceProvider())
                        byte[] rgbKey = Convert.FromBase64String(Key);
                        byte[] rgbIV = Convert.FromBase64String(IV);
                        using (MemoryStream ms = new MemoryStream())
                            using (CryptoStream cs = new CryptoStream(ms, csp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
                                cs.Write(inputByteArray, 0, inputByteArray.Length);
                                cs.FlushFinalBlock();
                                ret = Encoding.UTF8.GetString(ms.ToArray());
                    break;
                case EncoderType.DES:
                    using (DESCryptoServiceProvider csp = new DESCryptoServiceProvider())
                        byte[] rgbKey = Convert.FromBase64String(Key);
                        byte[] rgbIV = Convert.FromBase64String(IV);
                        using (MemoryStream ms = new MemoryStream())
                            using (CryptoStream cs = new CryptoStream(ms, csp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
                                cs.Write(inputByteArray, 0, inputByteArray.Length);
                                cs.FlushFinalBlock();
                                ret = Encoding.UTF8.GetString(ms.ToArray());
                    break;
                case EncoderType.RC2:
                    using (RC2CryptoServiceProvider csp = new RC2CryptoServiceProvider())
                        byte[] rgbKey = Convert.FromBase64String(Key);
                        byte[] rgbIV = Convert.FromBase64String(IV);
                        using (MemoryStream ms = new MemoryStream())
                            using (CryptoStream cs = new CryptoStream(ms, csp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
                                cs.Write(inputByteArray, 0, inputByteArray.Length);
                                cs.FlushFinalBlock();
                                ret = Encoding.UTF8.GetString(ms.ToArray());
                    break;
                case EncoderType.TripleDES:
                    using (TripleDESCryptoServiceProvider csp = new TripleDESCryptoServiceProvider())
                        byte[] rgbKey = Convert.FromBase64String(Key);
                        byte[] rgbIV = Convert.FromBase64String(IV);
                        using (MemoryStream ms = new MemoryStream())
                            using (CryptoStream cs = new CryptoStream(ms, csp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
                                cs.Write(inputByteArray, 0, inputByteArray.Length);
                                cs.FlushFinalBlock();
                                ret = Encoding.UTF8.GetString(ms.ToArray());
                    break;
                //可逆編碼(非對稱金鑰)
                case EncoderType.RSA:
                    using (RSACryptoServiceProvider csp = new RSACryptoServiceProvider())
                        csp.FromXmlString(Key);
                        ret = Encoding.UTF8.GetString(csp.Decrypt(inputByteArray, false));
                    break;
            return ret;
1.先新增一個C#的Windows Form應用程式的專案, 名稱為 Encoder
2.在在Form1上分別拉進
4個TextBox
5個Label
3個Button
1個ComboBox

檔案: Form1.Designer.cs

namespace Encoder
    partial class Form1
        /// <summary>
        /// 設計工具所需的變數。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// 清除任何使用中的資源。
        /// </summary>
        /// <param name="disposing">如果應該處置 Managed 資源則為 true,否則為 false。</param>
        protected override void Dispose(bool disposing)
            if (disposing && (components != null))
                components.Dispose();
            base.Dispose(disposing);
        #region Windows Form 設計工具產生的程式碼
        /// <summary>
        /// 此為設計工具支援所需的方法 - 請勿使用程式碼編輯器
        /// 修改這個方法的內容。
        /// </summary>
        private void InitializeComponent()
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.textBox2 = new System.Windows.Forms.TextBox();
            this.label2 = new System.Windows.Forms.Label();
            this.label3 = new System.Windows.Forms.Label();
            this.comboBox1 = new System.Windows.Forms.ComboBox();
            this.button3 = new System.Windows.Forms.Button();
            this.label4 = new System.Windows.Forms.Label();
            this.label5 = new System.Windows.Forms.Label();
            this.textBox3 = new System.Windows.Forms.TextBox();
            this.textBox4 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // textBox1
            this.textBox1.Location = new System.Drawing.Point(-1, 21);
            this.textBox1.Multiline = true;
            this.textBox1.Name = "textBox1";
            this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
            this.textBox1.Size = new System.Drawing.Size(400, 400);
            this.textBox1.TabIndex = 0;
            // label1
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(-1, 3);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(41, 12);
            this.label1.TabIndex = 1;
            this.label1.Text = "加密前";
            // button1
            this.button1.Location = new System.Drawing.Point(406, 100);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 2;
            this.button1.Text = "加密 ->";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // button2
            this.button2.Location = new System.Drawing.Point(406, 130);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(75, 23);
            this.button2.TabIndex = 3;
            this.button2.Text = "<- 解密";
            this.button2.UseVisualStyleBackColor = true;
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // textBox2
            this.textBox2.Location = new System.Drawing.Point(492, 21);
            this.textBox2.Multiline = true;
            this.textBox2.Name = "textBox2";
            this.textBox2.ScrollBars = System.Windows.Forms.ScrollBars.Both;
            this.textBox2.Size = new System.Drawing.Size(400, 400);
            this.textBox2.TabIndex = 4;
            // label2
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(492, 3);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(41, 12);
            this.label2.TabIndex = 5;
            this.label2.Text = "加密後";
            // label3
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(13, 428);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(53, 12);
            this.label3.TabIndex = 6;
            this.label3.Text = "編碼方式";
            // comboBox1
            this.comboBox1.FormattingEnabled = true;
            this.comboBox1.Location = new System.Drawing.Point(72, 428);
            this.comboBox1.Name = "comboBox1";
            this.comboBox1.Size = new System.Drawing.Size(121, 20);
            this.comboBox1.TabIndex = 7;
            // button3
            this.button3.Location = new System.Drawing.Point(211, 428);
            this.button3.Name = "button3";
            this.button3.Size = new System.Drawing.Size(75, 23);
            this.button3.TabIndex = 8;
            this.button3.Text = "產生新Key";
            this.button3.UseVisualStyleBackColor = true;
            this.button3.Click += new System.EventHandler(this.button3_Click);
            // label4
            this.label4.AutoSize = true;
            this.label4.Location = new System.Drawing.Point(15, 459);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(24, 12);
            this.label4.TabIndex = 9;
            this.label4.Text = "Key";
            // label5
            this.label5.AutoSize = true;
            this.label5.Location = new System.Drawing.Point(497, 462);
            this.label5.Name = "label5";
            this.label5.Size = new System.Drawing.Size(17, 12);
            this.label5.TabIndex = 10;
            this.label5.Text = "IV";
            // textBox3
            this.textBox3.Location = new System.Drawing.Point(72, 456);
            this.textBox3.Multiline = true;
            this.textBox3.Name = "textBox3";
            this.textBox3.ScrollBars = System.Windows.Forms.ScrollBars.Both;
            this.textBox3.Size = new System.Drawing.Size(327, 66);
            this.textBox3.TabIndex = 11;
            // textBox4
            this.textBox4.Location = new System.Drawing.Point(520, 456);
            this.textBox4.Multiline = true;
            this.textBox4.Name = "textBox4";
            this.textBox4.ScrollBars = System.Windows.Forms.ScrollBars.Both;
            this.textBox4.Size = new System.Drawing.Size(372, 66);
            this.textBox4.TabIndex = 12;
            // Form1
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(904, 538);
            this.Controls.Add(this.textBox4);
            this.Controls.Add(this.textBox3);
            this.Controls.Add(this.label5);
            this.Controls.Add(this.label4);
            this.Controls.Add(this.button3);
            this.Controls.Add(this.comboBox1);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.textBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();
        #endregion
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.TextBox textBox2;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.ComboBox comboBox1;
        private System.Windows.Forms.Button button3;
        private System.Windows.Forms.Label label4;
        private System.Windows.Forms.Label label5;
        private System.Windows.Forms.TextBox textBox3;
        private System.Windows.Forms.TextBox textBox4;

*檔案 Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using Encoder.Security;
namespace Encoder
    public partial class Form1 : Form
        public Form1()
            InitializeComponent();
            string[] comboItems = { 
                                    //可逆編碼(對稱金鑰)
                                    "AES",
                                    "DES",
                                    "RC2",
                                    "TripleDES",
                                    //可逆編碼(非對稱金鑰)
                                    "RSA",
                                    //不可逆編碼(雜湊值)
                                    "MD5",
                                    "SHA1",
                                    "SHA256",
                                    "SHA384",
                                    "SHA512"
            this.comboBox1.Items.Clear();
            foreach (string item in comboItems)
                this.comboBox1.Items.Add(item);
            this.comboBox1.SelectedIndex = 0;
        Encoder.Security.Encoder encode = new Encoder.Security.Encoder();
        EncoderType GetEncoderType()
            string str = this.comboBox1.Items[this.comboBox1.SelectedIndex].ToString();
            switch (str)
                //可逆編碼(對稱金鑰)
                case "AES":         return EncoderType.AES;
                case "DES":         return EncoderType.DES;
                case "RC2":         return EncoderType.RC2;
                case "TripleDES":   return EncoderType.TripleDES;
                //可逆編碼(非對稱金鑰)
                case "RSA":         return EncoderType.RSA;
                //不可逆編碼(雜湊值)
                case "MD5":         return EncoderType.MD5;
                case "SHA1":        return EncoderType.SHA1;
                case "SHA256":      return EncoderType.SHA256;
                case "SHA384":      return EncoderType.SHA384;
                case "SHA512":      return EncoderType.SHA512;
                default:
                        this.comboBox1.SelectedIndex = 0;
                        return EncoderType.AES;
        private void button1_Click(object sender, EventArgs e)
            EncoderType type = GetEncoderType();
            encode.Key = this.textBox3.Text;
            encode.IV = this.textBox4.Text;
            this.textBox2.Text = encode.Encrypt(type, this.textBox1.Text);            
        private void button2_Click(object sender, EventArgs e)
            EncoderType type = GetEncoderType();
            encode.Key = this.textBox3.Text;
            encode.IV = this.textBox4.Text;
            this.textBox1.Text = encode.Decrypt(type, this.textBox2.Text);     
        private void button3_Click(object sender, EventArgs e)
            EncoderType type = GetEncoderType();
            encode.GenerateKey(type);
            this.textBox3.Text= encode.Key;
            this.textBox4.Text = encode.IV;

3.最後, 建置 Encoder, 就這樣了