歡迎加入Unity業内qq交流群:956187480
一、資料加密的概念
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、資料加密和解密調用後運作效果圖如下: