欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實現(xiàn)加密與解密詳解

 更新時間:2022年06月03日 09:59:19   作者:springsnow  
本文詳細講解了C#實現(xiàn)加密與解密詳解的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、Hash加密,使用HashAlgorithm哈希算法類的派生類(MD5、SHA1等)

特點:只能加密,不可逆。可對目標信息生成一段特定長度唯一的Hash值。

HashAlgorithm派生類包括:

  • KeyedHashAlgorithm: 顯示所有加密哈希算法實現(xiàn)均必須從中派生的抽象類。
  • MD5: 表示 MD5 哈希算法的所有實現(xiàn)均從中繼承的抽象類。
    ————MD5Crypto?Service?Provider:使用加密服務提供程序 (CSP) 提供的實現(xiàn),計算輸入數(shù)據(jù)的 MD5 哈希值。
  • RIPEMD160: 表示 MD160 哈希算法的所有實現(xiàn)均從中繼承的抽象類。
  • SHA1: 計算輸入數(shù)據(jù)的 SHA1 哈希值。
    ————SHA1Crypto?Service?Provider:使用加密服務提供程序 (CSP) 提供的實現(xiàn),計算輸入數(shù)據(jù)的 SHA1 哈希值。
  • SHA256: 計算輸入數(shù)據(jù)的 SHA256 哈希值。
  • SHA384: 計算輸入數(shù)據(jù)的 SHA384 哈希值。
  • SHA512: 計算輸入數(shù)據(jù)的 SHA512 哈希值。

1、使用抽象類HashAlgorithm

//明文密碼由字符串轉換為byte數(shù)組
byte[] clearBytes =Encoding.Default.GetBytes("123");

//由明文的byte數(shù)組計算出MD5密文byte數(shù)組
byte[] hashedBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);
//把byte數(shù)組轉換為字符串后返回,BitConverter用于將基礎數(shù)據(jù)類型與字節(jié)數(shù)組相互轉換
string result = BitConverter.ToString(hashedBytes).Replace("-", "");

Console.Write(result);

2、使用抽象類MD5

byte[] clearBytes = Encoding.Default.GetBytes("123");
byte[] hashedBytes =  MD5.Create().ComputeHash(clearBytes);

StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < hashedBytes.Length; i++)
{
    sBuilder.Append(hashedBytes[i].ToString("x2"));
}
string result = sBuilder.ToString();
Console.Write(result);

3、使用MD5CryptoServiceProvider類

byte[] clearBytes = Encoding.Default.GetBytes("123");
byte[] hashedBytes = new MD5CryptoServiceProvider().ComputeHash(clearBytes);
string result = "";
for (int i = 0; i < hashedBytes.Length; i++)
    result += hashedBytes[i].ToString("X").PadLeft(2, '0');

Console.Write(result);

4、Web使用的Hash加密:FormsAuthentication類

FormAuthentication.HashPasswordForStoringInConfigFile(str,"MD5")//或者“SHA1”

5、文件哈希計算

  • MD5是一個將任意長度的數(shù)據(jù)字符串轉化成短的固定長度的值的單向操作。任意兩個字符串不應有相同的散列值(即,有“很大可能”是不一樣的,并且要人為地創(chuàng)造出來兩個散列值相同的字符串應該是困難的)。
  • 因此MD5經(jīng)常用于校驗字符串或者文件,因為如果文件的MD5不一樣,說明文件內(nèi)容也是不一樣的,即經(jīng)過修改的,如果發(fā)現(xiàn)下載的文件和給的md5值不一樣,就需要慎重使用。
  • MD5文件校驗用途非常多,例如:游戲patch包的校驗,病毒文件確認,app提審校驗等等,只要需要確認某一個文件的唯一性和正確性,都會使用md5作為校驗。

輸入文件路徑,就可以得到對應的哈希值,這個哈希值是對文件本身內(nèi)容包括文件名字有關,跟文件存放的路徑和運行平臺,設備無關。

string GetFileHash(string path)
{
    var hash = MD5.Create();//SHA1.Create();
    var stream = new FileStream(path, FileMode.Open);
    byte[] hashByte = hash.ComputeHash(stream);
    stream.Close();
    return BitConverter.ToString(hashByte).Replace("-", "");
}

二、對稱加密:使用SymmetricAlgorithm對稱算法類的派生類(Aes、DES等)

特點:指加密和解密使用相同密鑰的加密算法。

對稱加密算法的優(yōu)點在于加解密的高速度和使用長密鑰時的難破解性。

SymmetricAlgorithm派生類包括:

  • Aes:表示高級加密標準 (AES) 的所有實現(xiàn)都必須從中繼承的抽象基類。
    ————Aes?Crypto?Service?Provider:使用高級加密標準 (AES) 算法的加密應用程序編程接口 (CAPI) 實現(xiàn)來執(zhí)行對稱加密和解密。
  • DES:表示所有 DES 實現(xiàn)都必須從中派生的數(shù)據(jù)加密標準 (DES) 算法的基類。
    ————DESCrypto?Service?Provider:定義訪問數(shù)據(jù)加密標準 (DES) 算法的加密服務提供程序 (CSP) 版本的包裝對象。
  • RC2:表示 RC2 算法的所有實現(xiàn)都必須從中派生的基類。
  • Rijndael:表示 Rijndael 對稱加密算法的所有實現(xiàn)必須從其繼承的基類。
  • TripleDES:表示三重數(shù)據(jù)加密標準算法的基類
public static string strKey = "abcdefgh";//注意:這里的密鑰sKey必須能轉為8個byte,即輸入密鑰為8半角個字符或者4個全角字符或者4個漢字的字符串
public static string strIV = "ijklmnop";

// 加密
public static string Encrypt(string _strQ)
{
    byte[] buffer = Encoding.UTF8.GetBytes(_strQ);
    MemoryStream ms = new MemoryStream();
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    CryptoStream encStream = new CryptoStream(ms, des.CreateEncryptor(Encoding.UTF8.GetBytes(strKey), Encoding.UTF8.GetBytes(strIV)), CryptoStreamMode.Write);
    encStream.Write(buffer, 0, buffer.Length);
    encStream.FlushFinalBlock();
    return Convert.ToBase64String(ms.ToArray());
}

// 解密
public static string Decrypt(string _strQ)
{
    byte[] buffer = Convert.FromBase64String(_strQ);
    MemoryStream ms = new MemoryStream();
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    CryptoStream encStream = new CryptoStream(ms, des.CreateDecryptor(Encoding.UTF8.GetBytes(strKey), Encoding.UTF8.GetBytes(strIV)), CryptoStreamMode.Write);
    encStream.Write(buffer, 0, buffer.Length);
    encStream.FlushFinalBlock();
    return Encoding.UTF8.GetString(ms.ToArray());
}

三、非對稱加密:使用AsymmetricAlgorithm非對稱算法類的派生類(DSA、RSA等)

特點:指加密和解密使用不同密鑰的加密算法,也稱為公私鑰加密。公鑰是可以公開用來加密,私匙嚴格由接受方保密用于加密。

非對稱加密的缺點是加解密速度要遠遠慢于對稱加密。

AsymmetricAlgorithm派生類包括:

  • DSA:表示數(shù)字簽名算法(DSA)的所有實現(xiàn)都必須從中繼承的抽象基類。
    ————DSACryptoServiceProvider:使用加密服務提供程序 (CSP) 提供的 DSA算法的實現(xiàn)執(zhí)行不對稱加密和解密。
  • ECDiffie?Hellman:
  • ECDsa:
  • RSA:表示 RSA 算法的所有實現(xiàn)均從中繼承的基類。
    ————RSACrypto?Service?Provider:使用加密服務提供程序 (CSP) 提供的 RSA 算法的實現(xiàn)執(zhí)行不對稱加密和解密。
/// 

/// 獲取加密所使用的key,RSA算法是一種非對稱密碼算法,所謂非對稱,就是指該算法需要一對密鑰,使用其中一個加密,則需要用另一個才能解密。
/// 
public static void GetKey()
{
    string PublicKey = string.Empty;
    string PrivateKey = string.Empty;
    RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
    PublicKey = rSACryptoServiceProvider.ToXmlString(false);
    // 獲取公匙,用于加密
    PrivateKey = rSACryptoServiceProvider.ToXmlString(true);
    // 獲取公匙和私匙,用于解密

    //Console.WriteLine("PublicKey is {0}", PublicKey);        // 輸出公匙
    //Console.WriteLine("PrivateKey is {0}", PrivateKey);     // 輸出密匙
    //密匙中含有公匙,公匙是根據(jù)密匙進行計算得來的。

    using (StreamWriter streamWriter = new StreamWriter("PublicKey.xml"))
    {
        streamWriter.Write(rSACryptoServiceProvider.ToXmlString(false));// 將公匙保存到運行目錄下的PublicKey
    }
    using (StreamWriter streamWriter = new StreamWriter("PrivateKey.xml"))
    {
        streamWriter.Write(rSACryptoServiceProvider.ToXmlString(true)); // 將公匙&私匙保存到運行目錄下的PrivateKey
    }
}

/// 

/// 加密
/// 
private static string Encryption(string str)
{
    RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
    using (StreamReader streamReader = new StreamReader("PublicKey.xml")) // 讀取運行目錄下的PublicKey.xml
    {
        rSACryptoServiceProvider.FromXmlString(streamReader.ReadToEnd()); // 將公匙載入進RSA實例中
    }

    byte[] buffer = Encoding.UTF8.GetBytes(str); // 將明文轉換為byte[]

    // 加密后的數(shù)據(jù)就是一個byte[] 數(shù)組,可以以 文件的形式保存 或 別的形式(網(wǎng)上很多教程,使用Base64進行編碼化保存)
    byte[] EncryptBuffer = rSACryptoServiceProvider.Encrypt(buffer, false); // 進行加密
    return Convert.ToBase64String(EncryptBuffer); // 如果使用base64進行明文化,在解密時 需要再次將base64 轉換為byte[]
}

/// 

/// 解密
/// 
private static string Decrypt(string strEncryptBase64)
{
    RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();
    using (StreamReader streamReader = new StreamReader("PrivateKey.xml")) // 讀取運行目錄下的PrivateKey.xml
    {
        rSACryptoServiceProvider.FromXmlString(streamReader.ReadToEnd()); // 將私匙載入進RSA實例中
    }

    byte[] buffer = Convert.FromBase64String(strEncryptBase64);
    // 解密后得到一個byte[] 數(shù)組
    byte[] DecryptBuffer = rSACryptoServiceProvider.Decrypt(buffer, false); // 進行解密
    string str = Encoding.UTF8.GetString(DecryptBuffer); // 將byte[]轉換為明文

    return str;
}

到此這篇關于C#加密與解密的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C#對接阿里云IOT平臺進行設備開發(fā)

    C#對接阿里云IOT平臺進行設備開發(fā)

    這篇文章介紹了C#對接阿里云IOT平臺進行設備開發(fā),對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-01-01
  • C#根據(jù)日期計算星期幾的實例代碼

    C#根據(jù)日期計算星期幾的實例代碼

    本示例采用基姆拉爾森計算公式來根據(jù)日期計算未來日子是星期幾。對基姆拉爾森計算公式不清楚的朋友可以先看下計算公式哦。本文分為客戶端和服務的實現(xiàn)C#根據(jù)日期計算星期幾的實例代碼,需要的朋友參考下
    2016-08-08
  • 事務在c#中的使用

    事務在c#中的使用

    這篇文章介紹了事務在c#中的使用,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#執(zhí)行存儲過程并將結果填充到GridView的方法

    C#執(zhí)行存儲過程并將結果填充到GridView的方法

    這篇文章主要介紹了C#執(zhí)行存儲過程并將結果填充到GridView的方法,結合實例形式分析了C#存儲過程操作及GridView控件相關操作技巧,需要的朋友可以參考下
    2017-02-02
  • C#:foreach與yield語句的介紹

    C#:foreach與yield語句的介紹

    C#:foreach與yield語句的介紹,需要的朋友可以參考一下
    2013-03-03
  • C#中委托用法實例詳解

    C#中委托用法實例詳解

    這篇文章主要介紹了C#中委托用法,以實例形式較為詳細的分析了C#中委托的概念與使用技巧,需要的朋友可以參考下
    2015-06-06
  • C# 獲取IP及判斷IP是否在區(qū)間

    C# 獲取IP及判斷IP是否在區(qū)間

    本文主要介紹了C# 獲取IP及判斷IP是否在區(qū)間的方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • C#?WPF?ListBox?動態(tài)顯示圖片功能

    C#?WPF?ListBox?動態(tài)顯示圖片功能

    這篇文章主要介紹了C#?WPF?ListBox?動態(tài)顯示圖片,處理過程分為前臺代碼和后臺代碼,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • C# TextBox多行文本框的字數(shù)限制問題

    C# TextBox多行文本框的字數(shù)限制問題

    最近在使用C# TextBox多行文本框的時候,發(fā)現(xiàn)了其對字數(shù)限制的一點問題,所以總結下在使用C# TextBox多行文本框要注意的的字數(shù)限制問題,現(xiàn)在分享給大家,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • C#刪除整個目錄及子目錄的方法

    C#刪除整個目錄及子目錄的方法

    這篇文章主要介紹了C#刪除整個目錄及子目錄的方法,涉及C#操作目錄刪除的相關技巧,需要的朋友可以參考下
    2015-04-04

最新評論