数据加密标准(DES)的C#实现(2)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*
* 数据加密标准(DES)的C#实现(2)
*
* 采用随机的密钥Key和初始化向量IV加密
* 使用随机密码的好处:系统不会产生弱密钥
* 备注:采用Base64编码格式输出密文、密钥和初始化向量
*
* 夏春涛 Email:xChuntao@163.com
* Blog:http://bluesky521.cnblogs.com
* 运行环境:.net2.0 framework
*/
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*
* 关于DES加密中的初始化向量IV:
* 对于给定的密钥 k,不使用初始化向量的简单块密码将同一个纯文本输入块加密为
* 同一个密码文本输出块。如果您的纯文本流中有重复块,则您的密码文本流中也会
* 有重复块。如果未经授权的用户知道了您的纯文本块结构的任何信息,他们就可以
* 利用该信息来解密已知的密码文本块,并有可能重新获得您的密钥。为了防止这个
* 问题,前一个块中的信息被混合到下一个块的加密过程中。这样一来,两个相同的
* 纯文本块的输出就变得不一样了。由于此技术使用前一个块加密下一个块,因此需
* 要初始化向量来加密数据的第一个块。
*/
![](/Images/OutliningIndicators/None.gif)
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
![](/Images/OutliningIndicators/None.gif)
namespace DES_App2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
class Program
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
static void Main(string[] args)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string str_plain_text = "How are you?";
Console.WriteLine("原文:" + str_plain_text);
![](/Images/OutliningIndicators/InBlock.gif)
string KEY_64 = "";
string IV_64 = "";
![](/Images/OutliningIndicators/InBlock.gif)
string str_cypher_text = DES_Encrypt(str_plain_text,out KEY_64,out IV_64);
Console.WriteLine("密文:" + str_cypher_text);
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("解密:" + DES_Decrypt(str_cypher_text, KEY_64, IV_64));
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("本次密钥:" + KEY_64);
Console.WriteLine("本次初始化向量:" + IV_64);
Console.WriteLine();
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
DES加密/解密#region DES加密/解密
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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>
![](/Images/OutliningIndicators/InBlock.gif)
static public string DES_Encrypt(string str_plain_text, out string str_des_key, out string str_des_iv)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string str_cypher_text = "";
![](/Images/OutliningIndicators/InBlock.gif)
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
![](/Images/OutliningIndicators/InBlock.gif)
MemoryStream ms = new MemoryStream();
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(), CryptoStreamMode.Write);
![](/Images/OutliningIndicators/InBlock.gif)
StreamWriter sw = new StreamWriter(cst);
sw.Write(str_plain_text);
sw.Flush();
cst.FlushFinalBlock();
sw.Flush();
//-----
str_cypher_text = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
![](/Images/OutliningIndicators/InBlock.gif)
str_des_key = Convert.ToBase64String(cryptoProvider.Key);
str_des_iv = Convert.ToBase64String(cryptoProvider.IV);
![](/Images/OutliningIndicators/InBlock.gif)
return str_cypher_text;
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// DES解密
/// </summary>
/// <param name="str_cypher_text">密文</param>
/// <param name="str_des_key">密钥,8个字符(64bit)</param>
/// <param name="str_des_iv">初始向量,8个字符(64bit)</param>
/// <returns>明文</returns>
static public string DES_Decrypt(string str_cypher_text, string str_des_key, string str_des_iv)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string str_plain_text = "";
![](/Images/OutliningIndicators/InBlock.gif)
byte[] byKey = Convert.FromBase64String(str_des_key);
byte[] byIV = Convert.FromBase64String(str_des_iv);
![](/Images/OutliningIndicators/InBlock.gif)
byte[] byEnc;
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
byEnc = Convert.FromBase64String(str_cypher_text);
}
catch
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return null;
}
![](/Images/OutliningIndicators/InBlock.gif)
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
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();
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
return str_plain_text;
}
#endregion
}
}
![](/Images/OutliningIndicators/None.gif)
源码附件:
/Files/bluesky521/DES_Hash_Demo.rar
原文地址:https://www.cnblogs.com/SummerRain/p/1005570.html