加密分目前為兩種:私密金鑰和公開金鑰加密,也稱對稱性和非對稱性加密.
私密金鑰加密只使用一把鑰匙來加解密,因為同一把密鑰既用於加密又用於解密,所以私密金鑰加密非常快(與公開金鑰演算法相比),特別適用於對較大的資料流執行加密轉換。
加解密有太多東西要介紹了,所以這次只介紹私密金鑰加密,私密金鑰加密,只用於一次加密一個資料區塊,也就是將N個位元組加密後轉換為加密的位元組輸出,既然是加密 ,
當然需要一個KEY,Right?而在.NET 中提供的加密類使用的是一個稱為"密碼塊鏈 (CBC) "的鏈模式,它需要一個KEY和一個IV初始化向量,它是分塊來加密的,而要先用IV向量來加密第一個塊,(萬事必須有個開頭嘛)
接著就用上一個塊加密下一個塊直到讀取完畢.
另外發送和接收訊息雙方,必須互相傳達了密鑰和 IV 的值且密鑰不能為未授權使用者所知.
私密金鑰加密的優點:速度快.缺點:有耐心的朋友可以用窮舉法破解,呵呵,我可沒耐心.
用途: 通常與公開金鑰加密一起使用,在公開金鑰加密中,先對公開金鑰加密後再將公開金鑰發送給對方.給公開金鑰加密演算法一個輔助作用.
囉嗦完了,下面看代碼:(先在執行檔案目錄建一個文字檔)
//------------------------------檔案加密過程
FileStream fin=new FileStream("input.txt",FileMode.Open,FileAccess.Read);
FileStream fout=new FileStream("output.txt",FileMode.OpenOrCreate,FileAccess.Write);
//建立加密類
DES des = new DESCryptoServiceProvider();
des.GenerateKey(); //擷取隨機產生的Key,和 IV
des.GenerateIV();
byte[] keys=des.Key;
byte[] ivs=des.IV;
long leng=fin.Length; //擷取檔案的長度
long temp=0; //臨時變數
byte[] buffer=new byte[400]; //用於隱藏檔內容於緩衝
CryptoStream cStream=new CryptoStream(fout,des.CreateEncryptor(keys,ivs),CryptoStreamMode.Write); //建立加密流並寫入到"output.txt"檔案
while(temp<leng)
{
int wLeng=fin.Read(buffer,0,400); //寫入緩衝
cStream.Write(buffer,0,wLeng); //寫入檔案
temp=temp+leng;
Console.WriteLine("加密成功");
Console.ReadLine();
}
cStream.Close();
fout.Close();
fin.Close();
解密:
//------------------------------檔案解密過程
FileStream fin1=new FileStream("output.txt",FileMode.Open,FileAccess.Read);
FileStream fout1=new FileStream("解密.txt",FileMode.OpenOrCreate,FileAccess.Write);
//DES des1 = new DESCryptoServiceProvider();
//des1.GenerateKey(); //擷取隨機產生的Key,和 IV
//des1.GenerateIV();
//byte[] keys1=des1.Key;
//byte[] ivs1=des1.IV;
long leng1=fin1.Length; //擷取檔案的長度
long temp1=0; //臨時變數
byte[] buffer1=new byte[400]; //用於隱藏檔內容於緩衝
CryptoStream cStream1=new CryptoStream(fout1,des.CreateDecryptor(keys,ivs),CryptoStreamMode.Write); //建立加密流並寫入到"output.txt"檔案
while(temp1<leng1)
{
int wLeng1=fin1.Read(buffer1,0,400); //寫入緩衝
cStream1.Write(buffer1,0,wLeng1); //寫入檔案
temp1=temp1+leng1;
Console.WriteLine("解密成功");
Console.ReadLine();
}
cStream.Close();
fout.Close();
fin.Close();
//--------------------------Over
關於DES演算法的加密過程參考:http://www.vchome.net/tech/datastruct/datasf25.htm