一:简介
对称加密采用单密钥加密方式,不论是加密还是解密都是用同一个密钥,即“一把钥匙开一把锁”。对称加密的好处在于操作简单、管理方便、速度快。它的缺点在于密钥在网络传输中容易被窃听,每个密钥只能应用一次,对密钥管理造成了困难。对称加密的实现形式和加密算法的公开性使它依赖于密钥的安全性,而不是算法的安全性。
二:引入加密类库
using System.Security.Cryptography; //包含所有加密任务的核心类
using System.Security.Cryptography.Xml; //包含结合使用System.Security.Cryptography类,对XML文档部分内容进行加密和签名的类
using System.Security.Cryptography.X509Certificates; //包含允许检索证书信息的类
三:对称密码算法
算 法 |
抽象算法类 |
默认实现类 |
有效密钥大小 |
默认密钥大小 |
DES |
DES |
DESCryptoServiceProvider |
64位 |
64 |
TripleDES |
TripleDES |
TripleDESCryptoServiceProvider
|
128,192 |
192 |
RC2 |
RC2 |
RC2CryptoServiceProvider
|
40-128 |
128 |
Rijndael |
Rijndael |
RijndaelManaged
|
128,192,256 |
256 |
①DES:对称加密算法中最经典的算法莫过于DES加密算法。DES加密采用的是分组加密的方法,使用56位密钥加密64位明文,最后产生64位密文
②TripleDES:由于DES算法安全性方面的原因,为了提高DES算法的抗攻击性,因此提出了Triple-DES算法。用两个密钥对数据进行3次加密/解密运算。即首先使用第一个密钥对数据进行加密,然后用第二个密钥对其进行解密,最后用第一个密钥再加密
③RC2:该算法设计的目的是用来取代DES算法,它采用密钥长度可变的对明文采取64位分组的分组加密算法,属于Festel网络结构。
④Rijndael:是一个反复运算的加密算法,它允许可变动的数据区块及密钥的长度。数据区块与密钥长度的变动是各自独立的。
属性 |
说明 |
BlockSize |
使用该算法在一次操作中可以加密或解密的数据基本单位。 |
Key |
用于加密或解密数据的秘密值。 |
KeySize |
分配给秘密密钥的位数。 |
IV |
初始化向量,提供加密过程额外输入并提高安全性,初始化向量与密钥一样,加密者和解密者都必须知道,不过,它不需要保密。 重点:IV的长度总是和BlockSize 数据块的长度一样! |
LegalBlockSizes |
获取对称算法支持的块大小。 |
LegalKeySizes |
获取对称算法支持的密钥大小。 |
四:栗子
①DES加密算法的使用。
从第一个表可以看到密码是64位,8位一个字节,转换成byte数组就是长度为8
DES des = DES.Create();
Encoding e = Encoding.UTF8;
string str = DesCryptor(des, "讲文明树新风,北京朝阳区", e, "beijing8", "chaoyang");
Console.WriteLine(str);
var txt = DESDecryptor(des, str, e, "beijing8", "chaoyang");
/// <summary>
/// 加密
/// </summary>
/// <param name="des">算法</param>
/// <param name="str">明文</param>
/// <param name="e">编码</param>
/// <param name="key">秘钥</param>
/// <param name="iv">初始化向量</param>
/// <returns></returns>
private string DesCryptor(DES des, string str, Encoding e, string key, string iv)
{
if (string.IsNullOrEmpty(str) || string.IsNullOrEmpty(key) || string.IsNullOrEmpty(iv))
Console.WriteLine("参数不正确!");
CryptoStream cs = null;
Encoding ec = e ?? Encoding.Default;
Byte[] StrBytes = ec.GetBytes(str);
Byte[] KeyBytes = Encoding.ASCII.GetBytes(key);
Byte[] IVBytes = Encoding.ASCII.GetBytes(iv);
try
{
MemoryStream ms = new MemoryStream();
cs = new CryptoStream(ms, des.CreateEncryptor(KeyBytes, IVBytes), CryptoStreamMode.Write);
cs.Write(StrBytes, 0, StrBytes.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch (CryptographicException ex)
{
throw new ArgumentException(ex.Message);
}
finally
{
cs?.Close();
}
}
/// <summary>
/// 解密
/// </summary>
/// <param name="des">算法</param>
/// <param name="str">密文</param>
/// <param name="e">编码</param>
/// <param name="key">秘钥</param>
/// <param name="iv">初始化向量</param>
/// <returns></returns>
private object DESDecryptor(DES des, string str, Encoding e, string key, string iv)
{
if (string.IsNullOrEmpty(str)
|| string.IsNullOrEmpty(key)
|| string.IsNullOrEmpty(iv))
throw new ArgumentNullException("参数不正确!");
CryptoStream cs = null;
Encoding ec = e ?? Encoding.Default;
Byte[] StrBytes = Convert.FromBase64String(str);
Byte[] KeyBytes = Encoding.ASCII.GetBytes(key);
Byte[] IVBytes = Encoding.ASCII.GetBytes(iv);
try
{
MemoryStream ms = new MemoryStream();
cs = new CryptoStream(ms, des.CreateDecryptor(KeyBytes, IVBytes), CryptoStreamMode.Write);
cs.Write(StrBytes, 0, StrBytes.Length);
cs.FlushFinalBlock();
return ec.GetString(ms.ToArray());
}
catch (CryptographicException ex)
{
throw new ArgumentException(ex.Message);
}
finally
{
cs?.Close();
}
}
②剩下的加密算法,只需要更换类名即可
TripleDES算法:
TripleDES des = TripleDES.Create();
Encoding e = Encoding.UTF8;
string str = DesCryptor(des, "讲文明树新风,北京朝阳区", e, "beijing8", "chaoyang");
Console.WriteLine(str);
var txt = DESDecryptor(des, str, e, "beijing8", "chaoyang");
RC2算法:
RC2 des = RC2.Create();
Encoding e = Encoding.UTF8;
string str = DesCryptor(des, "讲文明树新风,北京朝阳区", e, "beijing8", "chaoyang");
Console.WriteLine(str);
var txt = DESDecryptor(des, str, e, "beijing8", "chaoyang");
Rijndael算法:
Rijndael des = Rijndael.Create();
Encoding e = Encoding.UTF8;
string str = DesCryptor(des, "讲文明树新风,北京朝阳区", e, "beijing8", "chaoyang");
Console.WriteLine(str);
var txt = DESDecryptor(des, str, e, "beijing8", "chaoyang");
参考来源:http://www.cnblogs.com/hailan2012/archive/2012/02/04/2338539.html