溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#如何實現加密與解密

發布時間:2022-06-06 10:00:03 來源:億速云 閱讀:234 作者:iii 欄目:開發技術

這篇文章主要講解了“C#如何實現加密與解密”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C#如何實現加密與解密”吧!

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

    特點:只能加密,不可逆??蓪δ繕诵畔⑸梢欢翁囟ㄩL度唯一的Hash值。

    HashAlgorithm派生類包括:

    • KeyedHashAlgorithm: 顯示所有加密哈希算法實現均必須從中派生的抽象類。

    • MD5: 表示 MD5 哈希算法的所有實現均從中繼承的抽象類。
      ————MD5CryptoServiceProvider:使用加密服務提供程序 (CSP) 提供的實現,計算輸入數據的 MD5 哈希值。

    • RIPEMD160: 表示 MD160 哈希算法的所有實現均從中繼承的抽象類。

    • SHA1: 計算輸入數據的 SHA1 哈希值。
      ————SHA1CryptoServiceProvider:使用加密服務提供程序 (CSP) 提供的實現,計算輸入數據的 SHA1 哈希值。

    • SHA256: 計算輸入數據的 SHA256 哈希值。

    • SHA384: 計算輸入數據的 SHA384 哈希值。

    • SHA512: 計算輸入數據的 SHA512 哈希值。

    1、使用抽象類HashAlgorithm

    //明文密碼由字符串轉換為byte數組
    byte[] clearBytes =Encoding.Default.GetBytes("123");
    
    //由明文的byte數組計算出MD5密文byte數組
    byte[] hashedBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);
    //把byte數組轉換為字符串后返回,BitConverter用于將基礎數據類型與字節數組相互轉換
    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是一個將任意長度的數據字符串轉化成短的固定長度的值的單向操作。任意兩個字符串不應有相同的散列值(即,有“很大可能”是不一樣的,并且要人為地創造出來兩個散列值相同的字符串應該是困難的)。

    • 因此MD5經常用于校驗字符串或者文件,因為如果文件的MD5不一樣,說明文件內容也是不一樣的,即經過修改的,如果發現下載的文件和給的md5值不一樣,就需要慎重使用。

    • MD5文件校驗用途非常多,例如:游戲patch包的校驗,病毒文件確認,app提審校驗等等,只要需要確認某一個文件的唯一性和正確性,都會使用md5作為校驗。

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

    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等)

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

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

    SymmetricAlgorithm派生類包括:

    • Aes:表示高級加密標準 (AES) 的所有實現都必須從中繼承的抽象基類。
      &mdash;&mdash;&mdash;&mdash;AesCryptoServiceProvider:使用高級加密標準 (AES) 算法的加密應用程序編程接口 (CAPI) 實現來執行對稱加密和解密。

    • DES:表示所有 DES 實現都必須從中派生的數據加密標準 (DES) 算法的基類。
      &mdash;&mdash;&mdash;&mdash;DESCryptoServiceProvider:定義訪問數據加密標準 (DES) 算法的加密服務提供程序 (CSP) 版本的包裝對象。

    • RC2:表示 RC2 算法的所有實現都必須從中派生的基類。

    • Rijndael:表示 Rijndael 對稱加密算法的所有實現必須從其繼承的基類。

    • TripleDES:表示三重數據加密標準算法的基類

    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:表示數字簽名算法(DSA)的所有實現都必須從中繼承的抽象基類。
      &mdash;&mdash;&mdash;&mdash;DSACryptoServiceProvider:使用加密服務提供程序 (CSP) 提供的 DSA算法的實現執行不對稱加密和解密。

    • ECDiffieHellman:

    • ECDsa:

    • RSA:表示 RSA 算法的所有實現均從中繼承的基類。
      &mdash;&mdash;&mdash;&mdash;RSACryptoServiceProvider:使用加密服務提供程序 (CSP) 提供的 RSA 算法的實現執行不對稱加密和解密。

    /// 
    
    /// 獲取加密所使用的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);     // 輸出密匙
        //密匙中含有公匙,公匙是根據密匙進行計算得來的。
    
        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[]
    
        // 加密后的數據就是一個byte[] 數組,可以以 文件的形式保存 或 別的形式(網上很多教程,使用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[] 數組
        byte[] DecryptBuffer = rSACryptoServiceProvider.Decrypt(buffer, false); // 進行解密
        string str = Encoding.UTF8.GetString(DecryptBuffer); // 將byte[]轉換為明文
    
        return str;
    }

    感謝各位的閱讀,以上就是“C#如何實現加密與解密”的內容了,經過本文的學習后,相信大家對C#如何實現加密與解密這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女