C#做的一个加密/解密的类
生活随笔
收集整理的這篇文章主要介紹了
C#做的一个加密/解密的类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| C#做的一個加密/解密的類 | |
| 前兩年寫的東西,現在整理一下發出來!以前公司需要做WebService,并且對WebService的SoapHeader進行加密,所以就寫了這么個東東!使用這個類,需要密鑰管理!為了保證數據的安全性往往要對數據進行加密,但是加密的缺點之一,就是影響程序的運行效率,所以,當時我的思路是只對用戶的登錄信息(用戶名,密碼)進行加密!數據用明文傳輸,用戶信息驗證沒有通過的情況下, 不進行數據傳輸。 實際在網絡通訊中,使用密鑰匙的方式并非無懈可擊,如果黑客可以捕捉到用密鑰加密的,用戶驗證信息,然后,做個模擬請求,向提供WebService的服務器發請求,還是可以獲得請求數據!所以,我又使用了IP或者域名綁定的方式!畢竟,WebService不是直接對最終用戶提供的!所以,加上以上這些手段后,就算有不良企圖者想通過非法方式獲得WebService提供的服務,就再費點勁吧! 還有一點安全建議,就是定期的更換密鑰,在這個例子中,我用的是對稱加密,加密方和解密方的密鑰一致!定期的更換密鑰可以讓安全性提高一大截! 大家要有更好的方法,或者建議,可以留言討論一下!共同提高! 代碼如下: using System; using System.Security.Cryptography ; using System.Text; using System.IO; namespace SEDO { /// <summary> /// SEDO 的摘要說明。 /// SEDO 實現的是用一個封裝了4種對稱加密方法(Des,Rc2,Rijndael,TripleDes)的組件 /// /// 注意事項: /// 1:TripleDes和Rijndael加密/解密對象使用16或者24位byte的Key /// 2:Rijndael只能使用16位的初始化向量IV /// 3:Des和Rc2均使用8位Byte的Key和IV /// 4:對需要加密/解密的數據流采用何種方法進行編碼/解碼,由調用組件的用戶自己決定 /// 5:密鑰和初始化向量IV由使用者自己定義 /// 程序員: 王海波 2003-05-19 hwnanghb@21cn.com /// </summary> //定義加密類型的枚舉 public enum EncryptionAlgorithm {Des = 1, Rc2, Rijndael, TripleDes}; //定義加密類 internal class EncryptTransformer { private EncryptionAlgorithm algorithmID; private byte[] initVec; private byte[] encKey; internal EncryptTransformer(EncryptionAlgorithm algId) { //Save the algorithm being used. algorithmID = algId; } internal ICryptoTransform GetCryptoServiceProvider(byte[] bytesKey) { //當數據密鑰Key或者初始化向量IV為空的時候,將使用加密對象自動產生的密鑰Key或者初始化向量IV switch (algorithmID) { case EncryptionAlgorithm.Des: { DES des = new DESCryptoServiceProvider(); des.Mode = CipherMode.CBC; // See if a key was provided if (null == bytesKey) { encKey = des.Key; } else { des.Key = bytesKey; encKey = des.Key; } // See if the client provided an initialization vector if (null == initVec) { // Have the algorithm create one initVec = des.IV; } else { //No, give it to the algorithm des.IV = initVec; } return des.CreateEncryptor(); } case EncryptionAlgorithm.TripleDes: { TripleDES des3 = new TripleDESCryptoServiceProvider(); des3.Mode = CipherMode.CBC; // See if a key was provided if (null == bytesKey) { encKey = des3.Key; } else { des3.Key = bytesKey; encKey = des3.Key; } // See if the client provided an IV if (null == initVec) { //Yes, have the alg create one initVec = des3.IV; } else { //No, give it to the alg. des3.IV = initVec; } return des3.CreateEncryptor(); } case EncryptionAlgorithm.Rc2: { RC2 rc2 = new RC2CryptoServiceProvider(); rc2.Mode = CipherMode.CBC; // Test to see if a key was provided if (null == bytesKey) { encKey = rc2.Key; } else { rc2.Key = bytesKey; encKey = rc2.Key; } // See if the client provided an IV if (null == initVec) { //Yes, have the alg create one initVec = rc2.IV; } else { //No, give it to the alg. rc2.IV = initVec; } return rc2.CreateEncryptor(); } case EncryptionAlgorithm.Rijndael: { Rijndael rijndael = new RijndaelManaged(); rijndael.Mode = CipherMode.CBC; // Test to see if a key was provided if(null == bytesKey) { encKey = rijndael.Key; } else { rijndael.Key = bytesKey; encKey = rijndael.Key; } // See if the client provided an IV if(null == initVec) { //Yes, have the alg create one initVec = rijndael.IV; } else { //No, give it to the alg. rijndael.IV = initVec; } return rijndael.CreateEncryptor(); } default: { throw new CryptographicException("Algorithm ID ''" + algorithmID + "'' not supported."); } } } //加密的偏移向量 internal byte[] IV { get{return initVec;} set{initVec = value;} } //加密的密鑰 internal byte[] Key { get{return encKey;} set{encKey = value;} } } //定義解密類 internal class DecryptTransformer { private EncryptionAlgorithm algorithmID; private byte[] initVec; private byte[] encKey; internal DecryptTransformer(EncryptionAlgorithm deCryptId) { algorithmID = deCryptId; } //加密的偏移向量 internal byte[] IV { get{return initVec;} set{initVec = value;} } //加密的密鑰 internal byte[] Key { get{return encKey;} set{encKey = value;} } internal ICryptoTransform GetCryptoServiceProvider(byte[] bytesKey) { //當數據密鑰Key或者初始化向量IV為空的時候,將使用加密對象自動產生的密鑰Key或者初始化向量IV switch (algorithmID) { case EncryptionAlgorithm.Des: { DES des = new DESCryptoServiceProvider(); des.Mode = CipherMode.CBC; des.Key = bytesKey; des.IV = initVec; return des.CreateDecryptor(); } case EncryptionAlgorithm.TripleDes: { TripleDES des3 = new TripleDESCryptoServiceProvider(); des3.Mode = CipherMode.CBC; return des3.CreateDecryptor(bytesKey, initVec); } case EncryptionAlgorithm.Rc2: { RC2 rc2 = new RC2CryptoServiceProvider(); rc2.Mode = CipherMode.CBC; return rc2.CreateDecryptor(bytesKey, initVec); } case EncryptionAlgorithm.Rijndael: { Rijndael rijndael = new RijndaelManaged(); rijndael.Mode = CipherMode.CBC; return rijndael.CreateDecryptor(bytesKey, initVec); } default: { throw new CryptographicException("Algorithm ID ''" + algorithmID + "'' not supported."); } } } //end GetCryptoServiceProvider } //定義加密者類 public class Encryptor { private EncryptTransformer transformer; private byte[] initVec; private byte[] encKey; public Encryptor(EncryptionAlgorithm algId) { transformer = new EncryptTransformer(algId); } public byte[] Encrypt(byte[] bytesData, byte[] bytesKey,byte[] bytesIV) { //設置流對象用來保存加密數據字節流. MemoryStream memStreamEncryptedData = new MemoryStream(); transformer.IV=bytesIV; transformer.Key=bytesKey; ICryptoTransform transform = transformer.GetCryptoServiceProvider(bytesKey); CryptoStream encStream = new CryptoStream(memStreamEncryptedData,transform,CryptoStreamMode.Write); try { //將加密數據寫進流對象 encStream.Write(bytesData, 0, bytesData.Length); } catch(Exception ex) { throw new Exception("在數據加密的時候出現錯誤!錯誤提示: \n" + ex.Message); } //設置加密的Key和初始向量IV屬性 encKey = transformer.Key; initVec = transformer.IV; encStream.FlushFinalBlock(); encStream.Close(); //Send the data back. return memStreamEncryptedData.ToArray(); } public byte[] IV { get{return initVec;} set{initVec = value;} } public byte[] Key { get{return encKey;} set{encKey = value;} } } //定義解密者類 public class Decryptor { private DecryptTransformer transformer; private byte[] initVec; private byte[] encKey; public Decryptor(EncryptionAlgorithm algId) { transformer = new DecryptTransformer(algId); } public byte[] Decrypt(byte[] bytesData, byte[] bytesKey,byte[] bytesIV) { //設置流對象用來保存解密數據字節流. MemoryStream memStreamDecryptedData = new MemoryStream(); //Pass in the initialization vector. transformer.IV = bytesIV; transformer.Key = bytesKey; ICryptoTransform transform = transformer.GetCryptoServiceProvider(bytesKey); CryptoStream decStream = new CryptoStream(memStreamDecryptedData,transform, CryptoStreamMode.Write); try { decStream.Write(bytesData, 0, bytesData.Length); } catch(Exception ex) { throw new Exception("在數據解密的時候出現錯誤!錯誤提示: \n" + ex.Message); } decStream.FlushFinalBlock(); decStream.Close(); // 返回解密數據. return memStreamDecryptedData.ToArray(); } public byte[] IV { get{return initVec;} set{initVec = value;} } public byte[] Key { get{return encKey;} set{encKey = value;} } } //類描述:文件加密/解密類 public class SecurityFile { private DecryptTransformer Dec_Transformer; //解密轉換器 private EncryptTransformer Enc_Transformer; //加密轉換器 private byte[] initVec; private byte[] encKey; public SecurityFile(EncryptionAlgorithm algId) { Dec_Transformer = new DecryptTransformer(algId); Enc_Transformer = new EncryptTransformer(algId); } //加密的偏移向量 internal byte[] IV { get{return initVec;} set{initVec = value;} } //加密的密鑰 internal byte[] Key { get{return encKey;} set{encKey = value;} } //功能描述:加密文件 public void EncryptFile(string inFileName, string outFileName, byte[] bytesKey, byte[] bytesIV) { try { FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read); FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write); fout.SetLength(0); //Create variables to help with read and write. byte[] bin = new byte[100]; //This is intermediate storage for the encryption. long rdlen = 0; //This is the total number of bytes written. long totlen = fin.Length; //This is the total length of the input file. int len; //This is the number of bytes to be written at a time. Enc_Transformer.IV=bytesIV; Enc_Transformer.Key=bytesKey; ICryptoTransform transform = Enc_Transformer.GetCryptoServiceProvider(bytesKey); CryptoStream encStream = new CryptoStream(fout, transform, CryptoStreamMode.Write); //Read from the input file, then encrypt and write to the output file. while(rdlen < totlen) { len = fin.Read(bin, 0, 100); encStream.Write(bin, 0, len); rdlen = rdlen + len; } encStream.Close(); fout.Close(); fin.Close(); } catch(Exception ex) { throw new Exception("在文件加密的時候出現錯誤!錯誤提示: \n" + ex.Message); } } //功能描述:解密文件 public void DecryptFile(string inFileName, string outFileName, byte[] bytesKey, byte[] bytesIV) { try { FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read); FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write); fout.SetLength(0); //Create variables to help with read and write. byte[] bin = new byte[100]; //This is intermediate storage for the encryption. long rdlen = 0; //This is the total number of bytes written. long totlen = fin.Length; //This is the total length of the input file. int len; //This is the number of bytes to be written at a time. Dec_Transformer.IV=bytesIV; Dec_Transformer.Key=bytesKey; ICryptoTransform transform = Dec_Transformer.GetCryptoServiceProvider(bytesKey); CryptoStream encStream = new CryptoStream(fout, transform, CryptoStreamMode.Write); //Read from the input file, then encrypt and write to the output file. while(rdlen < totlen) { len = fin.Read(bin, 0, 100); encStream.Write(bin, 0, len); rdlen = rdlen + len; } encStream.Close(); fout.Close(); fin.Close(); } catch(Exception ex) { throw new Exception("在文件加密的時候出現錯誤!錯誤提示: \n" + ex.Message); } } } } |
轉載于:https://www.cnblogs.com/cheatlove/articles/413322.html
總結
以上是生活随笔為你收集整理的C#做的一个加密/解密的类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Leetcode][第415题][JA
- 下一篇: Vi Notes