中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

C#開發中有哪些常用的加密解密方法

發布時間:2021-06-25 16:39:13 來源:億速云 閱讀:170 作者:Leah 欄目:編程語言

C#開發中有哪些常用的加密解密方法,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一、MD5消息摘要算法

我想這是大家都常聽過的算法,可能也用的比較多。那么什么是MD5算法呢?MD5全稱是message-digest algorithm 5,簡單的說就是單向的加密,也就是說無法根據密文推導出明文。

MD5主要用途:

1、對一段信息生成信息摘要,該摘要對該信息具有唯一性,可以作為數字簽名

2、用于驗證文件的有效性(是否有丟失或損壞的數據)

3、對用戶密碼的加密

4、在哈希函數中計算散列值

從上邊的主要用途中我們看到,由于算法的某些不可逆特征,在加密應用上有較好的安全性。通過使用MD5加密算法,我們輸入一個任意長度的字節串,都會生成一個128位的整數。所以根據這一點MD5被廣泛的用作密碼加密。下面我就像大家演示一下怎樣進行密碼加密。

首先需要引入命名空間,先看一個比較簡單的MD5加密的例子:

using System.Security;using System.Security.Cryptography;public string ToMD5(string strs) {      MD5 md5 = new MD5CryptoServiceProvider();      byte[] bytes = Encoding.Default.GetBytes(strs);//將要加密的字符串轉換為字節數組      byte[] encryptdata = md5.ComputeHash(bytes);//將字符串加密后也轉換為字符數組      return Convert.ToBase64String(encryptdata);//將加密后的字節數組轉換為加密字符串 }

這里我們需要注意的是,不論是在加密的過程中,加密前要將加密字符串轉為字節數組,加密后也要生成密文的字節數據,然后再轉化為密文。

下面是關于MD5加密的其他形式,可以根據需求編寫你們自己需要的加密算法:

/// <summary>    /// 創建哈希字符串適用于任何 MD5 哈希函數 (在任何平臺) 上創建 32 個字符的十六進制格式哈希字符串    /// </summary>    /// <param name="source"></param>    /// <returns></returns>    public static string Get32MD5One(string source)    {      using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())      {        byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source));        System.Text.StringBuilder sBuilder = new System.Text.StringBuilder();        for (int i = 0; i < data.Length; i++)        {          sBuilder.Append(data[i].ToString("x2"));        }        string hash = sBuilder.ToString();        return hash.ToUpper();      }    }    /// <summary>    /// 獲取16位md5加密    /// </summary>    /// <param name="source"></param>    /// <returns></returns>    public static string Get16MD5One(string source)    {      using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())      {        byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source));        //轉換成字符串,并取9到25位        string sBuilder = BitConverter.ToString(data, 4, 8);        //BitConverter轉換出來的字符串會在每個字符中間產生一個分隔符,需要去除掉        sBuilder = sBuilder.Replace("-", "");        return sBuilder.ToString().ToUpper();      }    }    //// <summary>    /// </summary>    /// <param name="strSource">需要加密的明文</param>    /// <returns>返回32位加密結果,該結果取32位加密結果的第9位到25位</returns>    public static string Get32MD5Two(string source)    {      System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();      //獲取密文字節數組      byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));      //轉換成字符串,32位      string strResult = BitConverter.ToString(bytResult);      //BitConverter轉換出來的字符串會在每個字符中間產生一個分隔符,需要去除掉      strResult = strResult.Replace("-", "");      return strResult.ToUpper();    }    //// <summary>    /// </summary>    /// <param name="strSource">需要加密的明文</param>    /// <returns>返回16位加密結果,該結果取32位加密結果的第9位到25位</returns>    public static string Get16MD5Two(string source)    {      System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();      //獲取密文字節數組      byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));      //轉換成字符串,并取9到25位      string strResult = BitConverter.ToString(bytResult, 4, 8);      //BitConverter轉換出來的字符串會在每個字符中間產生一個分隔符,需要去除掉      strResult = strResult.Replace("-", "");      return strResult.ToUpper();    }

二、DES加密

DES加密算法為密碼體制中的對稱密碼體制,又被稱為美國數據加密標準,是1972年美國IBM公司研制的對稱密碼體制加密算法。 明文按64位進行分組,密鑰長64位,密鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位, 使得每個密鑰都有奇數個1)分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法。

DES,全稱Data Encryption Standard,是一種對稱加密算法。由于其安全性比較高(有限時間內,沒有一種加密方法可以說是100%安全),很可能是最廣泛的密鑰系統(我們公司也在用,估計你們也有在用....),唯一一種方法可以破解該算法,那就是窮舉法。

/// <summary>    /// DES加密    /// </summary>    /// <param name="data">加密數據</param>    /// <param name="key">8位字符的密鑰字符串</param>    /// <param name="iv">8位字符的初始化向量字符串</param>    /// <returns></returns>    public static string DESEncrypt(string data, string key, string iv)    {      byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);      byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);      DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();      int i = cryptoProvider.KeySize;      MemoryStream ms = new MemoryStream();      CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);      StreamWriter sw = new StreamWriter(cst);      sw.Write(data);      sw.Flush();      cst.FlushFinalBlock();      sw.Flush();      return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);    }    /// <summary>    /// DES解密    /// </summary>    /// <param name="data">解密數據</param>    /// <param name="key">8位字符的密鑰字符串(需要和加密時相同)</param>    /// <param name="iv">8位字符的初始化向量字符串(需要和加密時相同)</param>    /// <returns></returns>    public static string DESDecrypt(string data, string key, string iv)    {      byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);      byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);      byte[] byEnc;      try      {        byEnc = Convert.FromBase64String(data);      }      catch      {        return null;      }      DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();      MemoryStream ms = new MemoryStream(byEnc);      CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);      StreamReader sr = new StreamReader(cst);      return sr.ReadToEnd();    }

此外還有AES加密算法,但是AES加密是一個新的可以用于保護電子數據的加密算法。其產生的密碼是迭代對稱的分組密碼,代加密使用一個循環結構,在該循環中重復置換和替換輸入數據。

三、RSA加密算法

在談RSA加密算法之前,我們需要先了解下兩個專業名詞,對稱加密和非對稱加密。

對稱加密即:含有一個稱為密鑰的東西,在消息發送前使用密鑰對消息進行加密,在對方收到消息之后,使用相同的密鑰進行解密

非對稱加密即:加密和解密使用不同的密鑰的一類加密算法。這類加密算法通常有兩個密鑰A和B,使用密鑰A加密數據得到的密文,只有密鑰B可以進行解密操作(即使密鑰A也無法解密),相反,使用了密鑰B加密數據得到的密文,只有密鑰A可以解密。這兩個密鑰分別稱為私鑰和公鑰,顧名思義,私鑰就是你個人保留,不能公開的密鑰,而公鑰則是公開給加解密操作的另一方的。根據不同用途,對數據進行加密所使用的密鑰也不相同(有時用公鑰加密,私鑰解密;有時相反用私鑰加密,公鑰解密)。非對稱加密的代表算法是RSA算法。

了解了這兩個名詞下面來講,RSA加密算法。RSA取名來自開發他們三者的名字。RSA是目前最有影響力的公鑰加密算法,多用于數據加密和數字簽名。雖然有這么大的影響力,但是同時它也有一些弊端,它產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密,分組長度太大等。

下面通過示例演示使用RSA加密、解密,引用名稱空間System.Security.Cryptography;

/// <summary>     /// RSA加密數據     /// </summary>     /// <param name="express">要加密數據</param>     /// <param name="KeyContainerName">密匙容器的名稱</param>     /// <returns></returns>     public static string RSAEncryption(string express, string KeyContainerName = null)    {      System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters();      param.KeyContainerName = KeyContainerName ?? "zhiqiang"; //密匙容器的名稱,保持加密解密一致才能解密成功      using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param))      {        byte[] plaindata = System.Text.Encoding.Default.GetBytes(express);//將要加密的字符串轉換為字節數組        byte[] encryptdata = rsa.Encrypt(plaindata, false);//將加密后的字節數據轉換為新的加密字節數組        return Convert.ToBase64String(encryptdata);//將加密后的字節數組轉換為字符串      }    }    /// <summary>     /// RSA解密數據     /// </summary>     /// <param name="express">要解密數據</param>     /// <param name="KeyContainerName">密匙容器的名稱</param>     /// <returns></returns>     public static string RSADecrypt(string ciphertext, string KeyContainerName = null)    {      System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters();      param.KeyContainerName = KeyContainerName ?? "zhiqiang"; //密匙容器的名稱,保持加密解密一致才能解密成功      using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param))      {        byte[] encryptdata = Convert.FromBase64String(ciphertext);        byte[] decryptdata = rsa.Decrypt(encryptdata, false);        return System.Text.Encoding.Default.GetString(decryptdata);      }    }

四、Base64編碼

這個就不做過多解釋了,直接上代碼。

#region Base64加密解密    /// <summary>    /// Base64加密    /// </summary>    /// <param name="input">需要加密的字符串</param>    /// <returns></returns>    public static string Base64Encrypt(string input)    {      return Base64Encrypt(input, new UTF8Encoding());    }    /// <summary>    /// Base64加密    /// </summary>    /// <param name="input">需要加密的字符串</param>    /// <param name="encode">字符編碼</param>    /// <returns></returns>    public static string Base64Encrypt(string input, Encoding encode)    {      return Convert.ToBase64String(encode.GetBytes(input));    }    /// <summary>    /// Base64解密    /// </summary>    /// <param name="input">需要解密的字符串</param>    /// <returns></returns>    public static string Base64Decrypt(string input)    {      return Base64Decrypt(input, new UTF8Encoding());    }    /// <summary>    /// Base64解密    /// </summary>    /// <param name="input">需要解密的字符串</param>    /// <param name="encode">字符的編碼</param>    /// <returns></returns>    public static string Base64Decrypt(string input, Encoding encode)    {      return encode.GetString(Convert.FromBase64String(input));    }    #endregion

五、SHA安全散列算法

SHA,全稱SecureHashAlgorithm,是一種數據加密算法,該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),并把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。

下面貼SHA各種加密算法代碼:

//SHA為不可逆加密方式    public static string SHA1Encrypt(string Txt)    {      var bytes = System.Text.Encoding.Default.GetBytes(Txt);      var SHA = new System.Security.Cryptography.SHA1CryptoServiceProvider();      var encryptbytes = SHA.ComputeHash(bytes);      return Convert.ToBase64String(encryptbytes);    }    public static string SHA256Encrypt(string Txt)    {      var bytes = System.Text.Encoding.Default.GetBytes(Txt);      var SHA256 = new System.Security.Cryptography.SHA256CryptoServiceProvider();      var encryptbytes = SHA256.ComputeHash(bytes);      return Convert.ToBase64String(encryptbytes);    }    public static string SHA384Encrypt(string Txt)    {      var bytes = System.Text.Encoding.Default.GetBytes(Txt);      var SHA384 = new System.Security.Cryptography.SHA384CryptoServiceProvider();      var encryptbytes = SHA384.ComputeHash(bytes);      return Convert.ToBase64String(encryptbytes);    }    public string SHA512Encrypt(string Txt)    {      var bytes = System.Text.Encoding.Default.GetBytes(Txt);      var SHA512 = new System.Security.Cryptography.SHA512CryptoServiceProvider();      var encryptbytes = SHA512.ComputeHash(bytes);      return Convert.ToBase64String(encryptbytes);    }

六、AES加密算法

AES算法基于排列和置換運算。排列是對數據重新進行安排,置換是將一個數據單元替換為另一個。

AES 使用幾種不同的方法來執行排列和置換運算。 AES是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節)分組加密和解密數據。與公共密鑰密碼使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數據。通過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重復置換和替換輸入數據。

/// <summary>    /// AES 加密    /// </summary>    /// <param name="str">明文(待加密)</param>    /// <param name="key">密文</param>    /// <returns></returns>    public string AesEncrypt(string str, string key)    {      if (string.IsNullOrEmpty(str)) return null;      Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);       RijndaelManaged rm = new RijndaelManaged      {        Key = Encoding.UTF8.GetBytes(key),        Mode = CipherMode.ECB,        Padding = PaddingMode.PKCS7      };       ICryptoTransform cTransform = rm.CreateEncryptor();      Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);      return Convert.ToBase64String(resultArray);    }     /// <summary>    /// AES 解密    /// </summary>    /// <param name="str">明文(待解密)</param>    /// <param name="key">密文</param>    /// <returns></returns>    public string AesDecrypt(string str, string key)    {      if (string.IsNullOrEmpty(str)) return null;      Byte[] toEncryptArray = Convert.FromBase64String(str);       RijndaelManaged rm = new RijndaelManaged      {        Key = Encoding.UTF8.GetBytes(key),        Mode = CipherMode.ECB,        Padding = PaddingMode.PKCS7      };       ICryptoTransform cTransform = rm.CreateDecryptor();      Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);       return Encoding.UTF8.GetString(resultArray);    }

看完上述內容,你們掌握C#開發中有哪些常用的加密解密方法的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

琼中| 建瓯市| 久治县| 井研县| 山东省| 安义县| 耿马| 保康县| 宣武区| 来凤县| 和顺县| 郯城县| 石嘴山市| 阳原县| 霍邱县| 巴东县| 雷州市| 绵阳市| 石门县| 南阳市| 桓台县| 阜新市| 黄山市| 财经| 张掖市| 康定县| 孟州市| 伊川县| 河北区| 巴东县| 铜山县| 噶尔县| 海城市| 宁城县| 长垣县| 丹寨县| 双鸭山市| 新龙县| 河北省| 五寨县| 兴安盟|