狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#開(kāi)發(fā)中常用的加密解密方法

admin
2023年9月10日 12:10 本文熱度 1145

常見(jiàn)的加密方式分為可逆和不可逆兩種方式

    可逆:RSA,AES,DES等

    不可逆:常見(jiàn)的MD5,SHAD等


一、MD5消息摘要算法

我想這是大家都常聽(tīng)過(guò)的算法,可能也用的比較多。那么什么是MD5算法呢?MD5全稱是message-digest algorithm 5,簡(jiǎn)單的說(shuō)就是單向的加密,也就是說(shuō)無(wú)法根據(jù)密文推導(dǎo)出明文。

MD5主要用途:

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

2、用于驗(yàn)證文件的有效性(是否有丟失或損壞的數(shù)據(jù))

3、對(duì)用戶密碼的加密

4、在哈希函數(shù)中計(jì)算散列值

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

首先需要引入命名空間,先看一個(gè)比較簡(jiǎn)單的MD5加密的例子:

using System.Security;

using System.Security.Cryptography;

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

這里我們需要注意的是,不論是在加密的過(guò)程中,加密前要將加密字符串轉(zhuǎn)為字節(jié)數(shù)組,加密后也要生成密文的字節(jié)數(shù)據(jù),然后再轉(zhuǎn)化為密文。

下面是關(guān)于MD5加密的其他形式,可以根據(jù)需求編寫(xiě)你們自己需要的加密算法:

     /// <summary>
        /// 創(chuàng)建哈希字符串適用于任何 MD5 哈希函數(shù) (在任何平臺(tái)) 上創(chuàng)建 32 個(gè)字符的十六進(jìn)制格式哈希字符串
        /// </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));
                //轉(zhuǎn)換成字符串,并取9到25位
                string sBuilder = BitConverter.ToString(data, 4, 8);
                //BitConverter轉(zhuǎn)換出來(lái)的字符串會(huì)在每個(gè)字符中間產(chǎn)生一個(gè)分隔符,需要去除掉
                sBuilder = sBuilder.Replace("-", "");
                return sBuilder.ToString().ToUpper();
            }
        }
        //// <summary>
        /// </summary>
        /// <param name="strSource">需要加密的明文</param>
        /// <returns>返回32位加密結(jié)果,該結(jié)果取32位加密結(jié)果的第9位到25位</returns>
        public static string Get32MD5Two(string source)
        {
            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            //獲取密文字節(jié)數(shù)組
            byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
            //轉(zhuǎn)換成字符串,32位
            string strResult = BitConverter.ToString(bytResult);
            //BitConverter轉(zhuǎn)換出來(lái)的字符串會(huì)在每個(gè)字符中間產(chǎn)生一個(gè)分隔符,需要去除掉
            strResult = strResult.Replace("-", "");
            return strResult.ToUpper();
        }
        //// <summary>
        /// </summary>
        /// <param name="strSource">需要加密的明文</param>
        /// <returns>返回16位加密結(jié)果,該結(jié)果取32位加密結(jié)果的第9位到25位</returns>
        public static string Get16MD5Two(string source)
        {
            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            //獲取密文字節(jié)數(shù)組
            byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
            //轉(zhuǎn)換成字符串,并取9到25位
            string strResult = BitConverter.ToString(bytResult, 4, 8);
            //BitConverter轉(zhuǎn)換出來(lái)的字符串會(huì)在每個(gè)字符中間產(chǎn)生一個(gè)分隔符,需要去除掉
            strResult = strResult.Replace("-", "");
            return strResult.ToUpper();
        }


二、DES加密

DES加密算法為密碼體制中的對(duì)稱密碼體制,又被稱為美國(guó)數(shù)據(jù)加密標(biāo)準(zhǔn),是1972年美國(guó)IBM公司研制的對(duì)稱密碼體制加密算法。 明文按64位進(jìn)行分組,密鑰長(zhǎng)64位,密鑰事實(shí)上是56位參與DES運(yùn)算(第8、16、24、32、40、48、56、64位是校驗(yàn)位, 使得每個(gè)密鑰都有奇數(shù)個(gè)1)分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法。

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

        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="data">加密數(shù)據(jù)</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">解密數(shù)據(jù)</param>
        /// <param name="key">8位字符的密鑰字符串(需要和加密時(shí)相同)</param>
        /// <param name="iv">8位字符的初始化向量字符串(需要和加密時(shí)相同)</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加密是一個(gè)新的可以用于保護(hù)電子數(shù)據(jù)的加密算法。其產(chǎn)生的密碼是迭代對(duì)稱的分組密碼,代加密使用一個(gè)循環(huán)結(jié)構(gòu),在該循環(huán)中重復(fù)置換和替換輸入數(shù)據(jù)。


三、RSA加密算法

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

對(duì)稱加密即:含有一個(gè)稱為密鑰的東西,在消息發(fā)送前使用密鑰對(duì)消息進(jìn)行加密,在對(duì)方收到消息之后,使用相同的密鑰進(jìn)行解密

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

了解了這兩個(gè)名詞下面來(lái)講,RSA加密算法。RSA取名來(lái)自開(kāi)發(fā)他們?nèi)叩拿?。RSA是目前最有影響力的公鑰加密算法,多用于數(shù)據(jù)加密和數(shù)字簽名。雖然有這么大的影響力,但是同時(shí)它也有一些弊端,它產(chǎn)生密鑰很麻煩,受到素?cái)?shù)產(chǎn)生技術(shù)的限制,因而難以做到一次一密,分組長(zhǎng)度太大等。

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

     /// <summary> 
        /// RSA加密數(shù)據(jù) 
        /// </summary> 
        /// <param name="express">要加密數(shù)據(jù)</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);//將要加密的字符串轉(zhuǎn)換為字節(jié)數(shù)組
                byte[] encryptdata = rsa.Encrypt(plaindata, false);//將加密后的字節(jié)數(shù)據(jù)轉(zhuǎn)換為新的加密字節(jié)數(shù)組
                return Convert.ToBase64String(encryptdata);//將加密后的字節(jié)數(shù)組轉(zhuǎn)換為字符串
            }
        }
        /// <summary> 
        /// RSA解密數(shù)據(jù) 
        /// </summary> 
        /// <param name="express">要解密數(shù)據(jù)</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編碼

這個(gè)就不做過(guò)多解釋了,直接上代碼。

 #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,是一種數(shù)據(jù)加密算法,該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉(zhuǎn)換成一段(通常更?。┟芪?,也可以簡(jiǎn)單的理解為取一串輸入碼(稱為預(yù)映射或信息),并把它們轉(zhuǎn)化為長(zhǎng)度較短、位數(shù)固定的輸出序列即散列值(也稱為信息摘要或信息認(rèn)證代碼)的過(guò)程。

下面貼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算法基于排列和置換運(yùn)算。排列是對(duì)數(shù)據(jù)重新進(jìn)行安排,置換是將一個(gè)數(shù)據(jù)單元替換為另一個(gè)。

AES 使用幾種不同的方法來(lái)執(zhí)行排列和置換運(yùn)算。    AES是一個(gè)迭代的、對(duì)稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節(jié))分組加密和解密數(shù)據(jù)。與公共密鑰密碼使用密鑰對(duì)不同,對(duì)稱密鑰密碼使用相同的密鑰加密和解密數(shù)據(jù)。通過(guò)分組密碼返回的加密數(shù)據(jù)的位數(shù)與輸入數(shù)據(jù)相同。迭代加密使用一個(gè)循環(huán)結(jié)構(gòu),在該循環(huán)中重復(fù)置換和替換輸入數(shù)據(jù)。

     /// <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);
        }

該文章在 2023/9/10 12:10:12 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved