關鍵詞:數據加密用哪種方式更好?
ASP.NET(C#)常用數據加密和解密方法匯總
一、數據加密的概念
1、 基本概念
2、 基本功能
3、 加密形式
二、 數據加密的項目應用和學習
1、 媒體加密:DRM
2、 文件加密:文本加密、pdf、word
3、 數據加密:ASP.NET(C#)中的數據加密
4、 硬件加密:加密狗
三、 數據加密的發展趨勢
四、 網絡數據加密算法分類
1、 根本不考慮解密問題:MD5、
2、 私用密鑰加密:DES、AES
3、 公用密鑰加密:RSA
4、 數字證書:
五、對稱加密之DES加密和解密的講解
六、 非對稱加密之RSA加密和解密的講解
七、 ASP.NET(C#) 常用加密類實例調用講解
ASP.NET(C#)常用數據加密和解密方法匯總
數據加密技術是網絡中最基本的安全技術,主要是通過對網絡中傳輸的信息進行數據加密來保障其安全性,這是一種主動安全防御策略,用很小的代價即可為信息提供相當大的安全保護。
一、加密的基本概念
"加密",是一種限制對網絡上傳輸數據的訪問權的技術。原始數據(也稱為明文,plaintext)被加密設備(硬件或軟件)和密鑰加密而產生的經過編碼的數據稱為密文(ciphertext)。將密文還原為原始明文的過程稱為解密,它是加密的反向處理,但解密者必須利用相同類型的加密設備和密鑰對密文進行解密。
加密的基本功能包括:
1. 防止不速之客查看機密的數據文件;
2. 防止機密數據被泄露或篡改;
3. 防止特權用戶(如系統管理員)查看私人數據文件;
4. 使入侵者不能輕易地查找一個系統的文件。
數據加密是確保計算機網絡安全的一種重要機制,雖然由於成本、技術和管理上的復雜性等原因,目前尚未在網絡中普及,但數據加密的確是實現分布式系統和網絡環境下數據安全的重要手段之一。
數據加密可在網絡OSI七層協議(OSI是Open System Interconnect的縮寫,意為開放式系統互聯。國際標准組織(國際標准化組織)制定了OSI模型。這個模型把網絡通信的工作分為7層,分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。)的多層上實現、所以從加密技術應用的邏輯位置看,有三種方式:
①鏈路加密:通常把網絡層以下的加密叫鏈路加密,主要用於保護通信節點間傳輸的數據,加解密由置於線路上的密碼設備實現。根據傳遞的數據的同步方式又可分為同步通信加密和異步通信加密兩種,同步通信加密又包含字節同步通信加密和位同步通信加密。
②節點加密:是對鏈路加密的改進。在協議傳輸層上進行加密,主要是對源節點和目標節點之間傳輸數據進行加密保護,與鏈路加密類似.只是加密算法要結合在依附於節點的加密模件中,克服了鏈路加密在節點處易遭非法存取的缺點。
③端對端加密:網絡層以上的加密稱為端對端加密。是面向網絡層主體。對應用層的數據信息進行加密,易於用軟件實現,且成本低,但密鑰管理問題困難,主要適合大型網絡系統中信息在多個發方和收方之間傳輸的情況。
二、數據加密的應用
1、 媒體加密:DRM
2、 文件加密:文本加密、pdf、word
3、 數據加密:ASP.NET(C#)中的數據加密
4、 硬件加密:加密狗
三.加密技術發展趨勢
①私用密鑰加密技術與公開密鑰加密技術相結合:鑒於兩種密碼體制加密的特點,在實際應用中可以采用折衷方案,即結合使用DES/IDEA和RSA,以DES為"內核",RSA為"外殼",對於網絡中傳輸的數據可用DES或IDEA加密,而加密用的密鑰則用RSA加密傳送,此種方法既保證了數據安全又提高了加密和解密的速度,這也是目前加密技術發展的新方向之一。
②尋求新算法:跳出以常見的迭代為基礎的構造思路,脫離基於某些數學問題復雜性的構造方法。如劉尊全先生提出的劉氏算法,是一種基於密鑰的公開密鑰體制,它采用了隨機性原理構造加解密變換,並將其全部運算控制隱匿於密鑰中,密鑰長度可變。它是采用選取一定長度的分割來構造大的搜索空間,從而實現一次非線性變換。此種加密算法加密強度高、速度快、計算開銷低。
③加密最終將被集成到系統和網絡中,例如IPV6協議就已有了內置加密的支持,在硬件方面,Intel公司正研制一種加密協處理器。它可以集成到微機的主極上。
四、加密技術的分類
加密類型可以簡單地分為四種:
1. 根本不考慮解密問題;
2. 私用密鑰加密技術:對稱式加密(Symmetric Key Encryption):對稱式加密方式對加密和解密使用相同的密鑰。通常,這種加密方式在應用中難以實施,因為用同一種安全方式共享密鑰很難。如:RC4、RC2、DES 和 AES 系列加密算法。
3. 公開密鑰加密技術:非對稱密鑰加密(Asymmetric Key Encryption):非對稱密鑰加密使用一組公共/私人密鑰系統,加密時使用一種密鑰,解密時使用另一種密鑰。公共密鑰可以廣泛的共享和透露。當需要用加密方式向服務器外部傳送數據時,這種加密方式更方便。如: RSA
4. 數字證書。(Certificate):數字證書是一種非對稱密鑰加密,但是,一個組織可以使用證書並通過數字簽名將一組公鑰和私鑰與其擁有者相關聯。
五、對稱加密之DES加密與解密
一、 對稱加密
對稱加密,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的密鑰,信息的發送者和信息的接收者在進行信息的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼)。因此,通信雙方都必須獲得這把鑰匙,並保持鑰匙的秘密。
單鑰密碼系統的安全性依賴於以下兩個因素:
第一、加密算法必須是足夠強的,僅僅基於密文本身去解密信息在實踐上是不可能的。
第二、加密方法的安全性依賴於密鑰的秘密性,而不是算法的秘密性,因此,我們沒有必要確保算法的秘密性(事實上,現實中使用的很多單鑰密碼系統的算法都是公開的),但是我們一定要保證密鑰的秘密性。
DES(Data Encryption Standard)和TripleDES是對稱加密的兩種實現。
DES和TripleDES基本算法一致,只是TripleDES算法提供的key位數更多,加密可靠性更高。
DES使用的密鑰key為8字節,初始向量IV也是8字節。
TripleDES使用24字節的key,初始向量IV也是8字節。
兩種算法都是以8字節為一個塊進行加密,一個數據塊一個數據塊的加密,一個8字節的明文加密后的密文也是8字節。如果明文長度不為8字節的整數倍,添加值為0的字節湊滿8字節整數倍。所以加密后的密文長度一定為8字節的整數倍。
二、 加密解密過程
Figure 1. DES加密解密過程
上圖是整個DES和TripleDES算法的加密解密過程,下面以TripleDES為例,結合dotnet分析加密解密的各個步驟,並給出相關實現代碼。
1、 生成key和IV
System.Security.Cryptography. TripleDESCryptoServiceProvider類是dotnet中實現TripleDES算法的主要的類。
TripleDESCryptoServiceProvider類只有一個構造方法TripleDESCryptoServiceProvider(),這個方法把一些屬性初始化:
KeySize(加密密鑰長度,以位為單位)= 192(24字節)
BlockSize(加密處理的數據塊大小,以位為單位)= 64(8字節)
FeedbackSize(加密數據塊后返回的數據大小,以位為單位)= 64(8字節)
TripleDESCryptoServiceProvider構造方法同時會初始化一組隨機的key和IV。
默認的TripleDESCryptoServiceProvider的key為24字節,IV為8字節,加密數據塊為8字節。
生成key和IV的代碼很簡單:
TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider(); byte[] keyArray = tDESalg.Key; byte[] IVArray = tDESalg.IV;
生成的key和IV在加密過程和解密過程都要使用。
2、 字符串明文轉成某一代碼頁對應的編碼字節流
待加密的數據可能有兩種形式,一種是二進制的數據,本身就是一組字節流,這樣的數據可以跳過這一步,直接進入加密步驟。還有一種情況是字符串數據,字符串中同樣的字符使用不同的代碼頁會生成不同的字節碼,所以從字符串到字節流的轉換是需要指定使用何種編碼的。在解密之后,要從字節流轉換到字符串就要使用相同的代碼頁解碼,否則就會出現亂碼。
// 待加密的字符串
string plainTextString = "Here is some data to encrypt. 這里是一些要加密的數據。";
// 使用utf-8編碼(也可以使用其它的編碼)
Encoding sEncoding = Encoding.GetEncoding("utf-8");
// 把字符串明文轉換成utf-8編碼的字節流
byte[] plainTextArray = sEncoding.GetBytes(plainTextString);
3、 加密操作
加密的原料是明文字節流,TripleDES算法對字節流進行加密,返回的是加密后的字節流。同時要給定加密使用的key和IV。
// 把字符串明文轉換成utf-8編碼的字節流
byte[] plainTextArray = sEncoding.GetBytes(plainTextString); public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV) { // 建立一個MemoryStream,這里面存放加密后的數據流 MemoryStream mStream = new MemoryStream(); // 使用MemoryStream 和key、IV新建一個CryptoStream 對象 CryptoStream cStream = new CryptoStream(mStream, new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV), CryptoStreamMode.Write); // 將加密后的字節流寫入到MemoryStream cStream.Write(plainTextArray, 0, plainTextArray.Length); //把緩沖區中的最后狀態更新到MemoryStream,並清除cStream的緩存區 cStream.FlushFinalBlock(); // 把解密后的數據流轉成字節流 byte[] ret = mStream.ToArray(); // 關閉兩個streams. cStream.Close(); mStream.Close(); return ret; }
4、 解密操作
解密操作解密上面步驟生成的密文byte[],需要使用到加密步驟使用的同一組Key和IV。
// 調用解密方法,返回已解密數據的byte[]
byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray); public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV) { // 建立一個MemoryStream,這里面存放加密后的數據流 MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray); // 使用MemoryStream 和key、IV新建一個CryptoStream 對象 CryptoStream csDecrypt = new CryptoStream(msDecrypt, new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV), CryptoStreamMode.Read); // 根據密文byte[]的長度(可能比加密前的明文長),新建一個存放解密后明文的byte[] byte[] DecryptDataArray = new byte[EncryptedDataArray.Length]; // 把解密后的數據讀入到DecryptDataArray csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length); msDecrypt.Close(); csDecrypt.Close(); return DecryptDataArray; }
有一點需要注意,DES加密是以數據塊為單位加密的,8個字節一個數據塊,如果待加密明byte[]的長度不是8字節的整數倍,算法先用值為“0”的byte補足8個字節,然后進行加密。所以加密后的密文長度一定是8的整數倍。這樣的密文解密后如果補了0值的byte,則解密后這些0值的byte依然存在。比如上例中要加密的明文是:
“Here is some data to encrypt. 這里是一些要加密的數據。”
轉成明文byte[]后是66個字節,DES算法就會補上6個0值的byte,補到72個字節。這樣加密后再解密回來的密文byte[]解碼后的字符串就是這樣的:
"Here is some data to encrypt. 這里是一些要加密的數據。\0\0\0\0\0\0"
5、 從編碼字節流轉成字符串明文
// 使用前面定義的Encoding,utf-8的編碼把byte[]轉成字符串
plainTextString = sEncoding.GetString(finalPlainTextArray);
六、非對稱加密之RSA加密和解密的講解
RSA公鑰加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美國麻省理工學院)開發的。RSA取名來自開發他們三者的名字。RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰數據加密標准。RSA算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。RSA算法是第一個能同時用於加密和數字簽名的算法,也易於理解和操作。
RSA是被研究得最廣泛的公鑰算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。RSA的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難度等價。即RSA的重大缺陷是無法從理論上把握它的保密性能如何,而且密碼學界多數人士傾向於因子分解不是NPC問題。
RSA的缺點主要有:
A)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。
B)分組長度太大,為保證安全性,n 至少也要 600bits以上,使運算代價很高,尤其是速度較慢,較對稱密碼算法慢幾個數量級;且隨着大數分解技術的發展,這個
長度還在增加,不利於數據格式的標准化。目前,SET(Secure Electronic Transaction)協議中要求CA采用2048bits長的密鑰,其他實體使用1024比特的密鑰。C)RSA密鑰長度隨着保密級別提高,增加很快。下表列出了對同一安全級別所對應的密鑰長度。
保密級別 |
對稱密鑰長度(bit) |
RSA密鑰長度(bit) |
ECC密鑰長度(bit) |
保密年限 |
80 |
80 |
1024 |
160 |
2010 |
112 |
112 |
2048 |
224 |
2030 |
128 |
128 |
3072 |
256 |
2040 |
192 |
192 |
7680 |
384 |
2080 |
256 |
256 |
15360 |
512 |
2120 |
這種算法1978年就出現了,它是第一個既能用於數據加密也能用於數字簽名的算法。它易於理解和操作,也很流行。算法的名字以發明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英國國家通信總局的數學家Clifford Cocks就發現了類似的算法。但是他的發現被列為絕密,直到1998年才公諸於世。
RSA算法是一種非對稱密碼算法,所謂非對稱,就是指該算法需要一對密鑰,使用其中一個加密,則需要用另一個才能解密。
RSA的算法涉及三個參數,n、e1、e2。
其中,n是兩個大質數p、q的積,n的二進制表示時所占用的位數,就是所謂的密鑰長度。
e1和e2是一對相關的值,e1可以任意取,但要求e1與(p-1)*(q-1)互質;再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n及e1),(n及e2)就是密鑰對。
RSA加解密的算法完全相同,設A為明文,B為密文,則:A=B^e1 mod n;B=A^e2 mod n;
e1和e2可以互換使用,即:
A=B^e2 mod n;B=A^e1 mod n;
C#代碼實現
需引用using System.Security.Cryptography;
/// <summary> /// RSA加密 /// </summary> /// <param name="publickey"></param> /// <param name="content"></param> /// <returns></returns> public static string RSAEncrypt(string publickey, string content) { publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(publickey); cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); return Convert.ToBase64String(cipherbytes); } /// <summary> /// RSA解密 /// </summary> /// <param name="privatekey"></param> /// <param name="content"></param> /// <returns></returns> public static string RSADecrypt(string privatekey, string content) { privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(privatekey); cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false); return Encoding.UTF8.GetString(cipherbytes); }
七、ASP.NET(C#)常用加密類調用的講解
1、C#常用加密解密類庫代碼如下:
/// <summary> /// MD5 加密靜態方法 /// </summary> /// <param name="EncryptString">待加密的密文</param> /// <returns>returns</returns> public static string MD5Encrypt(string EncryptString) { if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得為空")); } MD5 m_ClassMD5 = new MD5CryptoServiceProvider(); string m_strEncrypt = ""; try { m_strEncrypt = BitConverter.ToString(m_ClassMD5.ComputeHash(Encoding.Default.GetBytes(EncryptString))).Replace("-", ""); } catch (ArgumentException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_ClassMD5.Clear(); } return m_strEncrypt; } /// <summary> /// DES 加密(數據加密標准,速度較快,適用於加密大量數據的場合) /// </summary> /// <param name="EncryptString">待加密的密文</param> /// <param name="EncryptKey">加密的密鑰</param> /// <returns>returns</returns> public static string DESEncrypt(string EncryptString, string EncryptKey) { if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得為空")); } if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密鑰不得為空")); } if (EncryptKey.Length != 8) { throw (new Exception("密鑰必須為8位")); } byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; string m_strEncrypt = ""; DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider(); try { byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString); MemoryStream m_stream = new MemoryStream(); CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write); m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_cstream.FlushFinalBlock(); m_strEncrypt = Convert.ToBase64String(m_stream.ToArray()); m_stream.Close(); m_stream.Dispose(); m_cstream.Close(); m_cstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_DESProvider.Clear(); } return m_strEncrypt; } /// <summary> /// DES 解密(數據加密標准,速度較快,適用於加密大量數據的場合) /// </summary> /// <param name="DecryptString">待解密的密文</param> /// <param name="DecryptKey">解密的密鑰</param> /// <returns>returns</returns> public static string DESDecrypt(string DecryptString, string DecryptKey) { if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得為空")); } if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密鑰不得為空")); } if (DecryptKey.Length != 8) { throw (new Exception("密鑰必須為8位")); } byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; string m_strDecrypt = ""; DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider(); try { byte[] m_btDecryptString = Convert.FromBase64String(DecryptString); MemoryStream m_stream = new MemoryStream(); CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write); m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_cstream.FlushFinalBlock(); m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray()); m_stream.Close(); m_stream.Dispose(); m_cstream.Close(); m_cstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_DESProvider.Clear(); } return m_strDecrypt; } /// <summary> /// RC2 加密(用變長密鑰對大量數據進行加密) /// </summary> /// <param name="EncryptString">待加密密文</param> /// <param name="EncryptKey">加密密鑰</param> /// <returns>returns</returns> public static string RC2Encrypt(string EncryptString, string EncryptKey) { if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得為空")); } if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密鑰不得為空")); } if (EncryptKey.Length < 5 || EncryptKey.Length > 16) { throw (new Exception("密鑰必須為5-16位")); } string m_strEncrypt = ""; byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider(); try { byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString); MemoryStream m_stream = new MemoryStream(); CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write); m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_cstream.FlushFinalBlock(); m_strEncrypt = Convert.ToBase64String(m_stream.ToArray()); m_stream.Close(); m_stream.Dispose(); m_cstream.Close(); m_cstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_RC2Provider.Clear(); } return m_strEncrypt; } /// <summary> /// RC2 解密(用變長密鑰對大量數據進行加密) /// </summary> /// <param name="DecryptString">待解密密文</param> /// <param name="DecryptKey">解密密鑰</param> /// <returns>returns</returns> public static string RC2Decrypt(string DecryptString, string DecryptKey) { if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得為空")); } if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密鑰不得為空")); } if (DecryptKey.Length < 5 || DecryptKey.Length > 16) { throw (new Exception("密鑰必須為5-16位")); } byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; string m_strDecrypt = ""; RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider(); try { byte[] m_btDecryptString = Convert.FromBase64String(DecryptString); MemoryStream m_stream = new MemoryStream(); CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write); m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_cstream.FlushFinalBlock(); m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray()); m_stream.Close(); m_stream.Dispose(); m_cstream.Close(); m_cstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_RC2Provider.Clear(); } return m_strDecrypt; } /// <summary> /// 3DES 加密(基於DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高) /// </summary> /// <param name="EncryptString">待加密密文</param> /// <param name="EncryptKey1">密鑰一</param> /// <param name="EncryptKey2">密鑰二</param> /// <param name="EncryptKey3">密鑰三</param> /// <returns>returns</returns> public static string DES3Encrypt(string EncryptString, string EncryptKey1, string EncryptKey2, string EncryptKey3) { string m_strEncrypt = ""; try { m_strEncrypt = DESEncrypt(EncryptString, EncryptKey3); m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey2); m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey1); } catch (Exception ex) { throw ex; } return m_strEncrypt; } /// <summary> /// 3DES 解密(基於DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高) /// </summary> /// <param name="DecryptString">待解密密文</param> /// <param name="DecryptKey1">密鑰一</param> /// <param name="DecryptKey2">密鑰二</param> /// <param name="DecryptKey3">密鑰三</param> /// <returns>returns</returns> public static string DES3Decrypt(string DecryptString, string DecryptKey1, string DecryptKey2, string DecryptKey3) { string m_strDecrypt = ""; try { m_strDecrypt = DESDecrypt(DecryptString, DecryptKey1); m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey2); m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey3); } catch (Exception ex) { throw ex; } return m_strDecrypt; } /// <summary> /// AES 加密(高級加密標准,是下一代的加密算法標准,速度快,安全級別高,目前 AES 標准的一個實現是 Rijndael 算法) /// </summary> /// <param name="EncryptString">待加密密文</param> /// <param name="EncryptKey">加密密鑰</param> /// <returns></returns> public static string AESEncrypt(string EncryptString, string EncryptKey) { if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得為空")); } if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密鑰不得為空")); } string m_strEncrypt = ""; byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ=="); Rijndael m_AESProvider = Rijndael.Create(); try { byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString); MemoryStream m_stream = new MemoryStream(); CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write); m_csstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_csstream.FlushFinalBlock(); m_strEncrypt = Convert.ToBase64String(m_stream.ToArray()); m_stream.Close(); m_stream.Dispose(); m_csstream.Close(); m_csstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_AESProvider.Clear(); } return m_strEncrypt; } /// <summary> /// AES 解密(高級加密標准,是下一代的加密算法標准,速度快,安全級別高,目前 AES 標准的一個實現是 Rijndael 算法) /// </summary> /// <param name="DecryptString">待解密密文</param> /// <param name="DecryptKey">解密密鑰</param> /// <returns></returns> public static string AESDecrypt(string DecryptString, string DecryptKey) { if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得為空")); } if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密鑰不得為空")); } string m_strDecrypt = ""; byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ=="); Rijndael m_AESProvider = Rijndael.Create(); try { byte[] m_btDecryptString = Convert.FromBase64String(DecryptString); MemoryStream m_stream = new MemoryStream(); CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write); m_csstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_csstream.FlushFinalBlock(); m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray()); m_stream.Close(); m_stream.Dispose(); m_csstream.Close(); m_csstream.Dispose(); } catch (IOException ex) { throw ex; } catch (CryptographicException ex) { throw ex; } catch (ArgumentException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { m_AESProvider.Clear(); } return m_strDecrypt; }
2、數據加密和解密簡單代碼調用如下:
Response.Write("<br>-----------MD5加密---------------<br>");
Response.Write(SDKSecurity.MD5Encrypt("仰天一笑"));
Response.Write("<br>-----------DES加密---------------<br>");
Response.Write(SDKSecurity.DESEncrypt("仰天一笑", "anson-xu"));
Response.Write("<br>-----------DES解密---------------<br>");
Response.Write(SDKSecurity.DESDecrypt("l06JvJ45r/lb9iKzSXl47Q==", "anson-xu"));
Response.Write("<br>-----------AES加密---------------<br>");
Response.Write(SDKSecurity.AESEncrypt("仰天一笑", "ansonxuyu"));
Response.Write("<br>-----------AES解密---------------<br>");
Response.Write(SDKSecurity.AESDecrypt("avwKL+MO8+zoLHvzk0+TBA==", "ansonxuyu"));
3、數據加密和解密調用后運行效果圖如下: