1. 程式人生 > >C#開發中常用加密解密方法解析

C#開發中常用加密解密方法解析

一、MD5加密演算法

我想這是大家都常聽過的演算法,可能也用的比較多。那麼什麼是MD5演算法呢?MD5全稱是message-digest algorithm 5,簡單的說就是單向的加密,即是說無法根據密文推匯出明文。
MD5主要用途:
1、對一段資訊生成資訊摘要,該摘要對該資訊具有唯一性,可以作為數字簽名。
2、用於驗證檔案的有效性(是否有丟失或損壞的資料),
3、對使用者密碼的加密,
4、在雜湊函式中計算雜湊值
從上邊的主要用途中我們看到,由於演算法的某些不可逆特徵,在加密應用上有較好的安全性。通過使用MD5加密演算法,我們輸入一個任意長度的位元組串,都會生成一個128位的整數。所以根據這一點MD5被廣泛的用作密碼加密。下面我就像大家演示一下怎樣進行密碼加密。
具體程式碼如下:
首先需要引入名稱空間:

using System.Security;
using System.Security.Cryptography;
private void btnmd5_Click(object sender, EventArgs e)
{
 MD5 md5 = new MD5CryptoServiceProvider();
 byte[] palindata = Encoding.Default.GetBytes(txtyuan.Text);//將要加密的字串轉換為位元組陣列
 byte[] encryptdata=md5.ComputeHash(palindata);//將字串加密後也轉換為字元陣列
 txtjiami.Text = Convert.ToBase64String(encryptdata);//將加密後的位元組陣列轉換為加密字串
}

這裡我們需要注意的是,不論是在加密的過程中,加密前要將加密字串轉為位元組陣列,加密後也要生成密文的位元組資料,然後再轉化為密文。

二、RSA加密演算法

在談RSA加密演算法之前,我們需要先了解下兩個專業名詞,對稱加密和非對稱加密。
對稱加密即:含有一個稱為金鑰的東西,在訊息傳送前使用金鑰對訊息進行加密,在對方收到訊息之後,使用相同的金鑰進行解密
非對稱加密即:加密和解密使用不同的金鑰的一類加密演算法。這類加密演算法通常有兩個金鑰A和B,使用金鑰A加密資料得到的密文,只有金鑰B可以進行解密操作(即使金鑰A也無法解密),相反,使用了金鑰B加密資料得到的密文,只有金鑰A可以解密。這兩個金鑰分別稱為私鑰和公鑰,顧名思義,私鑰就是你個人保留,不能公開的金鑰,而公鑰則是公開給加解密操作的另一方的。根據不同用途,對資料進行加密所使用的金鑰也不相同(有時用公鑰加密,私鑰解密;有時相反用私鑰加密,公鑰解密)。非對稱加密的代表演算法是RSA演算法。
瞭解了這兩個名詞下面來講,RSA加密演算法。RSA取名來自開發他們三者的名字。RSA是目前最有影響力的公鑰加密演算法,多用於資料加密和數字簽名。雖然有這麼大的影響力,但是同時它也有一些弊端,它產生金鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密,分組長度太大等。
下面通過示例演示使用RSA加密、解密,引用名稱空間System.Security.Cryptography;

//加密
    private string Encryption(string express)
    {
        CspParameters param = new CspParameters();
        param.KeyContainerName = "oa_erp_dowork";//密匙容器的名稱,保持加密解密一致才能解密成功
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
        {
            byte[] plaindata = Encoding.Default.GetBytes(express);//將要加密的字串轉換為位元組陣列
            byte[] encryptdata = rsa.Encrypt(plaindata, false);//將加密後的位元組資料轉換為新的加密位元組陣列
            return Convert.ToBase64String(encryptdata);//將加密後的位元組陣列轉換為字串
        }
    }
 
    //解密
    private string Decrypt(string ciphertext)
    {
        CspParameters param = new CspParameters();
        param.KeyContainerName = "oa_erp_dowork";
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
        {
            byte[] encryptdata = Convert.FromBase64String(ciphertext);
            byte[] decryptdata = rsa.Decrypt(encryptdata, false);
            return Encoding.Default.GetString(decryptdata);
        }
    }

下面我再通過一個示例向大家演示,通過使用RSA加密演算法產出公匙和私匙

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
using (StreamWriter sw = new StreamWriter(Server.MapPath("PublicKey.xml")))//產生公匙
{
    sw.WriteLine(rsa.ToXmlString(false));
}
using (StreamWriter sw = new StreamWriter(Server.MapPath("PrivateKey.xml")))//產生私匙(也包含私匙)
{
    sw.WriteLine(rsa.ToXmlString(true));
}

三、DES加密

DES加密:使用一個 56 位的金鑰以及附加的 8 位奇偶校驗位,產生最大 64 位的分組大小。這是一個迭代的分組密碼,使用稱為 Feistel 的技術,其中將加密的文字塊分成兩半。使用子金鑰對其中一半應用迴圈功能,然後將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續下去,但最後一個迴圈不交換。DES 使用 16 個迴圈,使用異或,置換,代換,移位操作四種基本運算。專業術語就看看得了,下面直接給大家演示一個小demo,以幫助大家的理解。

// 先定義一個全域性的位元組陣列和例項化一個全域性的DESCryptoServiceProvider物件

byte[] buffer;

DESCryptoServiceProvider DesCSP = new DESCryptoServiceProvider();

//加密:

private void button2_Click(object sender, EventArgs e)
{
   MemoryStream ms = new MemoryStream();//先建立 一個記憶體流
   CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateEncryptor(),       
   CryptoStreamMode.Write);//將記憶體流連線到加密轉換流
   StreamWriter sw = new StreamWriter(cryStream);
   sw.WriteLine(txtyuan.Text);//將要加密的字串寫入加密轉換流
   sw.Close();
   cryStream.Close();
   buffer = ms.ToArray();//將加密後的流轉換為位元組陣列
   txtjiami.Text =Convert.ToBase64String(buffer);//將加密後的位元組陣列轉換為字串
}

//解密:

private void button1_Click(object sender, EventArgs e)
{
   MemoryStream ms = new MemoryStream(buffer);//將加密後的位元組資料加入記憶體流中
   CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateDecryptor(),    
   CryptoStreamMode.Read);//記憶體流連線到解密流中
   StreamReader sr = new StreamReader(cryStream);
   txthjiemi.Text = sr.ReadLine();//將解密流讀取為字串
   sr.Close();
   cryStream.Close();
   ms.Close();
}

此外還有AES加密演算法,但是AES加密是一個新的可以用於保護電子資料的加密演算法。其產生的密碼是迭代對稱的分組密碼,代加密使用一個迴圈結構,在該迴圈中重複置換和替換輸入資料。因為用的不是很多,在這裡就不再做具體的演示了。

原文來自:C#開發中常用加密解密方法解析