/**//*
* 資料加密标準(DES)的C#實作(2)
*
* 采用随機的密鑰Key和初始化向量IV加密
* 使用随機密碼的好處:系統不會産生弱密鑰
* 備注:采用Base64編碼格式輸出密文、密鑰和初始化向量
* 夏春濤 Email:[email protected]
* Blog:http://bluesky521.cnblogs.com
* 運作環境:.net2.0 framework
*/
/**//*
* 關于DES加密中的初始化向量IV:
* 對于給定的密鑰 k,不使用初始化向量的簡單塊密碼将同一個純文字輸入塊加密為
* 同一個密碼文本輸出塊。如果您的純文字流中有重複塊,則您的密碼文本流中也會
* 有重複塊。如果未經授權的使用者知道了您的純文字塊結構的任何資訊,他們就可以
* 利用該資訊來解密已知的密碼文本塊,并有可能重新獲得您的密鑰。為了防止這個
* 問題,前一個塊中的資訊被混合到下一個塊的加密過程中。這樣一來,兩個相同的
* 純文字塊的輸出就變得不一樣了。由于此技術使用前一個塊加密下一個塊,是以需
* 要初始化向量來加密資料的第一個塊。
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace DES_App2
{
class Program
static void Main(string[] args)
string str_plain_text = "How are you?";
Console.WriteLine("原文:" + str_plain_text);
string KEY_64 = "";
string IV_64 = "";
string str_cypher_text = DES_Encrypt(str_plain_text,out KEY_64,out IV_64);
Console.WriteLine("密文:" + str_cypher_text);
Console.WriteLine("解密:" + DES_Decrypt(str_cypher_text, KEY_64, IV_64));
Console.WriteLine("本次密鑰:" + KEY_64);
Console.WriteLine("本次初始化向量:" + IV_64);
Console.WriteLine();
}
DES加密/解密#region DES加密/解密
/**//// <summary>
/// DES加密
/// </summary>
/// <param name="str_plain_text">明文</param>
/// <param name="str_des_key">密鑰,8個字元(64bit)</param>
/// <param name="str_des_iv">初始向量,8個字元(64bit)</param>
/// <returns>密文</returns>
static public string DES_Encrypt(string str_plain_text, out string str_des_key, out string str_des_iv)
string str_cypher_text = "";
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream();
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cst);
sw.Write(str_plain_text);
sw.Flush();
cst.FlushFinalBlock();
//-----
str_cypher_text = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
str_des_key = Convert.ToBase64String(cryptoProvider.Key);
str_des_iv = Convert.ToBase64String(cryptoProvider.IV);
return str_cypher_text;
/// DES解密
/// <param name="str_cypher_text">密文</param>
/// <returns>明文</returns>
static public string DES_Decrypt(string str_cypher_text, string str_des_key, string str_des_iv)
string str_plain_text = "";
byte[] byKey = Convert.FromBase64String(str_des_key);
byte[] byIV = Convert.FromBase64String(str_des_iv);
byte[] byEnc;
try
byEnc = Convert.FromBase64String(str_cypher_text);
}
catch
return null;
MemoryStream ms = new MemoryStream(byEnc);
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cst);
str_plain_text = sr.ReadToEnd();
return str_plain_text;
#endregion
}
}