time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > .net > .net入门 > 对称加密与非对称加密原理分析及在.net中使用示例

对称加密与非对称加密原理分析及在.net中使用示例

时间:2014-11-20 15:47 点击:1277次 字体:[ ]




(一)对称加密(Symmetric Cryptography)

对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。

对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

2000年10月2日,美国国家标准与技术研究所(NIST--American National Institute of Standards and Technology)选择了Rijndael算法作为新的高级加密标准(AES--Advanced Encryption Standard)。.NET中包含了Rijndael算法,类名叫RijndaelManaged,下面举个例子。

加密过程:

  1. private string myData = "hello";  
  2.         private string myPassword = "OpenSesame";  
  3.         private byte[] cipherText;  
  4.         private byte[] salt = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0 };  
  5.               
  6.  
  7.         private void mnuSymmetricEncryption_Click(object sender, RoutedEventArgs e)  
  8.         {  
  9.             var key = new Rfc2898DeriveBytes(myPassword, salt);  
  10.             // Encrypt the data.  
  11.             var algorithm = new RijndaelManaged();  
  12.             algorithm.Key = key.GetBytes(16);  
  13.             algorithm.IV = key.GetBytes(16);  
  14.             var sourceBytes = new System.Text.UnicodeEncoding().GetBytes(myData);  
  15.             using (var sourceStream = new MemoryStream(sourceBytes))  
  16.             using (var destinationStream = new MemoryStream())  
  17.             using (var crypto = new CryptoStream(sourceStream, algorithm.CreateEncryptor(), CryptoStreamMode.Read))  
  18.             {  
  19.                 moveBytes(crypto, destinationStream);  
  20.                 cipherText = destinationStream.ToArray();  
  21.             }  
  22.             MessageBox.Show(String.Format("Data:{0}{1}Encrypted and Encoded:{2}", myData, Environment.NewLine, Convert.ToBase64String(cipherText)));  
  23.         }  
  24.         private void moveBytes(Stream source, Stream dest)  
  25.         {  
  26.             byte[] bytes = new byte[2048];  
  27.             var count = source.Read(bytes, 0, bytes.Length);  
  28.             while (0 != count)  
  29.             {  
  30.                 dest.Write(bytes, 0, count);  
  31.                 count = source.Read(bytes, 0, bytes.Length);  
  32.             }  
  33.         } 

解密过程:

  1. private void mnuSymmetricDecryption_Click(object sender, RoutedEventArgs e)  
  2.         {  
  3.             if (cipherText == null)  
  4.             {  
  5.                 MessageBox.Show("Encrypt Data First!");  
  6.                 return;  
  7.             }  
  8.             var key = new Rfc2898DeriveBytes(myPassword, salt);  
  9.             // Try to decrypt, thus showing it can be round-tripped.  
  10.             var algorithm = new RijndaelManaged();  
  11.             algorithm.Key = key.GetBytes(16);  
  12.             algorithm.IV = key.GetBytes(16);  
  13.             using (var sourceStream = new MemoryStream(cipherText))  
  14.             using (var destinationStream = new MemoryStream())  
  15.             using (var crypto = new CryptoStream(sourceStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read))  
  16.             {  
  17.                 moveBytes(crypto, destinationStream);  
  18.                 var decryptedBytes = destinationStream.ToArray();  
  19.                 var decryptedMessage = new UnicodeEncoding().GetString(  
  20.                 decryptedBytes);  
  21.                 MessageBox.Show(decryptedMessage);  
  22.             }  
  23.         } 

 

 

对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。



本文地址 : http://www.fengfly.com/plus/view-215487-1.html
标签: .NET
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: