|
|
| 安全问题:C#做的一个加密/解密的类 |
|
来源:Dotnet频道 |
作者:采集 |
时间:2008-3-31 |
|
代码如下: 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 = |
|
|
|
|
|
|
|