*
加密
與解密, 用於資料保密(在台灣每年合法申請監聽的數量超過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, 就這樣了