加密算法之对称加密

时间:2022-03-06 19:11:11

 

一:简介

     对称加密采用单密钥加密方式,不论是加密还是解密都是用同一个密钥,即“一把钥匙开一把锁”。对称加密的好处在于操作简单、管理方便、速度快。它的缺点在于密钥在网络传输中容易被窃听,每个密钥只能应用一次,对密钥管理造成了困难。对称加密的实现形式和加密算法的公开性使它依赖于密钥的安全性,而不是算法的安全性。

二:引入加密类库 

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