C#加密概述

Microsoft.NET以其強大的性能,世界級的工具支持,操作簡易性,擴展性,安全性等等優點,迅速的風靡全球,隨着使用者的越來越多,加密與解密的問題就越來越受關注。C# 是.NET的關鍵性語言,它是整個.NET平臺的基礎,下面介紹一下.NET平臺上C#語言的加密方法。
加密技術就是使用加密算法對數據進行加密,將有意義的字符編碼成無意義的字符,在加密的狀態下傳輸數據,然後由預定的接收方對數據進行解密,如果第三方截獲了加密的數據,解密數據是很困難的,達到使不應該訪問這些數據的人員無法讀取它們的目的,幫助保護數據不被查看和修改,並且可以幫助在本不安全的信道上提供安全的通信方式。

title

概括的說,加密技術有以下三個目的:
1. 保密性:幫助保護用戶的標識或數據不被讀取;
2. 數據完整性:幫助保護數據不更改;
3. 身份驗證:確保數據發自特定的一方。
爲了達到上述目的,可以使用算法和慣例的組合(加密基元)來創建加密方案。加密基元有:私匙加密,公匙加密,加密簽名,加密哈希。 下面介紹如何在.net下實現加密的過程和方法。
1.私匙加密
私匙加密算法使用單個私匙來加密和解密數據。由於具有密鑰的任意一方都可以使用該密鑰解密數據,因此必須保護密鑰不被未經授權的代理得到。私鑰加密又稱爲對稱加密,因爲同一密鑰既用於加密又用於解密。見下圖:


title

私鑰加密的優點是它的算法非常快(與公鑰算法相比),特別適用於對較大的數據流執行加密轉換。缺點是它假定雙方已就密鑰和 IV 達成協議,並且互相傳達了密鑰和 IV 的值。並且,密鑰必須對未經授權的用戶保密。
.NET Framework 提供了以下實現私鑰加密算法的類:
· DESCryptoServiceProvider
· RC2CryptoServiceProvider
· RijndaelManaged
· TripleDESCryptoServiceProvider

私匙加密例子:
在Microsoft Visual Studio新建一個WindowsApplication,界面如下圖。

title

在項目的*.cs文件中添加以下代碼:
添加頭文件:
using System.Collections;
using System.Security.Cryptography;
using System.IO;
添加文件加密的函數:
#region 文件加密函數
private bool MyEncrypt(String inName, String outName, byte[] desKey, byte[] desIV)
{ FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);
byte[] bin = new byte[100];
long rdlen = 0;
long totlen = fin.Length;
int len;
DES des = new DESCryptoServiceProvider();
CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
while(rdlen < totlen)
{ len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len; }
encStream.Close();
fout.Close();
fin.Close();
return true; }
#endregion
添加文件解密的函數:
#region 文件解密函數
private bool MyDecrypt(String inName, String outName, byte[] desKey, byte[] desIV)
{ FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);
byte[] bin = new byte[100];
long rdlen = 0;
long totlen = fin.Length;
int len;
DES des = new DESCryptoServiceProvider();
CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write);
while(rdlen < totlen)
{ len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len; }
encStream.Close();
fout.Close();
fin.Close();
return true; }
#endregion
在“加密”按鈕上添加以下代碼:
string key = this.textBox1.Text;
string IV="12345678";
byte[] deskey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
byte[] desIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV);
if (this.MyEncrypt(this.textBox2.Text, this.textBox3.Text, deskey, desIV))
{ MessageBox.Show("文件加密成功"); }
在“解密“按鈕上添加以下代碼:
string key = this.textBox1.Text;
string IV = "12345678";
byte[] deskey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
byte[] desIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV);
if (this.MyDecrypt(this.textBox2.Text, this.textBox3.Text, deskey, desIV))
{ MessageBox.Show("文件解密成功"); }
運行結果:
加密前: 加密後:

title

2.公匙加密
公鑰加密使用一個必須對未經授權的用戶保密的私鑰和一個可以對任何人公開的公鑰。公鑰和私鑰都在數學上是相關聯的;用公鑰加密的數據只能用私鑰解密,而用私鑰簽名的數據只能用公鑰驗證。公鑰可以提供給任何人,用於對要發送到私鑰持有者的數據進行加密。兩個密鑰對於通信會話都是唯一的。公鑰加密算法也稱爲不對稱算法,原因是需要用一個密鑰加密數據而需要用另一個密鑰來解密數據。見下圖:

title


公鑰算法的缺點(相對於私匙算法)是無法像私鑰算法那樣將數據鏈接起來成爲流,原因是它只可以加密少量數據。因此,不對稱操作不使用與對稱操作相同的流模型。公匙加密算法使用固定的緩衝區大小,而私鑰加密算法使用長度可變的緩衝區。
公匙加密具有更大的密鑰空間,因此不大容易受到對每個可能密鑰都進行嘗試的窮舉攻擊。由於不必保護公鑰,因此它易於分發。公鑰算法可用於創建數字簽名以驗證數據發送方的身份。但是,公鑰算法非常慢(與私鑰算法相比),不適合用來加密大量數據。公鑰算法僅對傳輸很少量的數據有用。
.NET Framework 提供以下實現公鑰加密算法的類:
· DSACryptoServiceProvider
· RSACryptoServiceProvider
公匙加密例子:
在Microsoft Visual Studio新建一個WindowsApplication,界面如下圖。

title

在項目的*.cs文件中添加以下代碼:
添加頭文件:
using System.Security.Cryptography;
using System.IO;
using System.Collections;
在“得到鑰匙信息”按鈕添加以下代碼:
crypt = new RSACryptoServiceProvider();
publickey = crypt.ToXmlString(false);
richTextBox1.Text = "導出祕匙的情況下:/n" + publickey + "/n";
privatekey = crypt.ToXmlString(true);
string info = "僅僅導出公匙的情況下:/n" + privatekey + "/n";
richTextBox1.AppendText(info);
crypt.Clear();
在“讀取私匙”按鈕添加以下代碼:
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Text File (*.txt)|*.txt|All File (*.*)|*.* ";
open.ShowDialog();
StreamReader sr = new StreamReader(open.FileName, UTF8Encoding.UTF8);
readprivatekey = sr.ReadToEnd();
sr.Close();
在“讀取公匙”按鈕添加以下代碼:
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Text File (*.txt)|*.txt|All File (*.*)|*.* ";
open.ShowDialog();
StreamReader sr = new StreamReader(open.FileName, UTF8Encoding.UTF8);
readprivatekey = sr.ReadToEnd();
sr.Close();
在“使用公匙加密”按鈕添加以下代碼:
crypt = new RSACryptoServiceProvider();
UTF8Encoding enc = new UTF8Encoding();
bytes = enc.GetBytes(textBox1.Text);
crypt.FromXmlString(readpublickey);
bytes = crypt.Encrypt(bytes, false);
string encryttext = enc.GetString(bytes);
richTextBox2.Text = encryttext ;
在“使用私匙解密”按鈕添加以下代碼:
UTF8Encoding enc = new UTF8Encoding();
byte[] decryptbyte;
crypt.FromXmlString(readprivatekey);
decryptbyte = crypt.Decrypt(bytes, false);
string encryttext = enc.GetString(decryptbyte);
richTextBox3.Text = encryttext ;
當得到鑰匙信息,分別保存公匙和私匙後,就在“加密解密文字”的選項卡片裏輸入要加密的文字,再分別讀取私匙和公匙,當按下“使用公匙加密”按鈕時,就會在richTextBox2中顯示出加密後的亂碼,當按下“使用私匙解密”按鈕時,就會在richTextBox3中顯示出加密前的文字。
3.數字簽名
數字簽名用來驗證發送方的身份並幫助保護數據的完整性。見公匙加密的圖,使用由用戶A生成的公鑰,用戶B可以通過將數字簽名與用戶A的數據和公鑰進行比較,從而驗證是否是用戶A發送了該數據。
爲了使用公鑰加密對消息進行數字簽名,用戶A首先將哈希算法應用於該消息以創建消息摘要。該消息摘要是數據的緊湊且唯一的表示形式。然後,用戶A用她的私鑰加密該消息摘要以創建他的個人簽名。在收到消息和簽名時,用戶B使用用戶A的公鑰解密簽名以恢復消息摘要,並使用與用戶A所使用的相同的哈希算法來散列消息。如果用戶B計算的消息摘要與從用戶B那裏收到的消息摘要完全一致,用戶B就可以確定該消息來自私鑰的持有人,並且數據未被修改過。
請注意,由於發送方的公鑰爲大家所周知,並且它通常包含在數字簽名格式中,因此任何人都可以驗證簽名。此方法不保守消息的機密;若要使消息保密,還必須對消息進行加密。
.NET Framework 提供以下實現數字簽名算法的類:
l DSACryptoServiceProvider
l RSACryptoServiceProvider
4.哈希值
哈希算法將任意長度的二進制值映射爲固定長度的較小二進制值,這個小的二進制值稱爲哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨後的哈希計算都將產生不同的值。要找到散列爲同一個值的兩個不同的輸入,在計算上是不可能的。
消息身份驗證代碼 (MAC) 哈希函數通常與數字簽名一起用於對數據進行簽名,而消息檢測代碼 (MDC) 哈希函數則用於數據完整性。
雙方(用戶A,B)可按下面的方式使用哈希函數來確保數據的完整性。如果用戶A對用戶B編寫一條消息並創建該消息的哈希,則用戶B可以在稍後散列該消息並將他的哈希與原始哈希進行比較。如果兩個哈希值相同,則該消息沒有被更改;如果值不相同,則該消息在用戶A編寫它之後已被更改。爲了使此係統發揮作用,用戶A必須對除用戶B外的所有人保密原始的哈希值。
.NET Framework 提供以下實現數字簽名算法的類:
l HMACSHA1
l MACTripleDES
l MD5CryptoServiceProvider
l SHA1Managed
l SHA256Managed
l SHA384Managed
l SHA512Managed
5.隨機數生成
隨機數生成是許多加密操作不可分割的組成部分。例如,加密密鑰需要儘可能地隨機,以便使生成的密鑰很難再現。加密隨機數生成器必須生成無法以計算方法推算出(低於 p < .05 的概率)的輸出;即,任何推算下一個輸出位的方法不得比隨機猜測具有更高的成功概率。.NET Framework 中的類使用隨機數生成器生成加密密鑰。
RNGCryptoServiceProvider類是隨機數生成器算法的實現。

.NET已經把加密時所用到的算法都封裝起來了,可以很方便的調用,且安全性很高,大大縮短軟件開發的週期。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章