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