c#中,在System.Security.Cryptography命名空间中有一些常用的关于加密算法的类。
1. DES类
DES是一个抽象类,DESCryptoServiceProvider 类是它的一个实现类。
DES的主要属性有两个:密钥 (Key) 和初始化向量 (IV) 。主要方法:加密方法CreateEncryptor()和解密方法CreateDecryptor()。
MSDN上的一个加密文件的例子:
- private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV)
- {
- //Create the file streams to handle the input and output files.
- FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
- FileStream fout = new FileStream(outName, 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.
-
- DES des = new DESCryptoServiceProvider();
- CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
-
- Console.WriteLine("Encrypting...");
-
- //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;
- Console.WriteLine("{0} bytes processed", rdlen);
- }
-
- encStream.Close();
- fout.Close();
- fin.Close();
- }
可以用同样的方式处理解密;使用 CreateDecryptor 而不是 CreateEncryptor。必须使用加密该文件所用的同一密钥 (Key) 和初始化向量 (IV) 对文件进行解密。如果Key或IV为null,会自动调用GenerateKey和GetHashCode创建随机密钥和向量。
我自己写的一个例子:
- // 加密
- public static byte[] Encrypt(String str, byte[] key, byte[] iv)
- {
- byte[] data = Encoding.ASCII.GetBytes(str.ToCharArray());
- byte[] result;
- DES des = new DESCryptoServiceProvider();
- des.Key = key;
- des.IV = iv;
- result = des.CreateEncryptor().TransformFinalBlock(data, 0, data.Length);
- return result;
- }
-
- // 解密
- public static String Decrypt(byte[] data, byte[] key, byte[] iv)
- {
- byte[] result;
- DES des = new DESCryptoServiceProvider();
- result = des.CreateDecryptor(key, iv).TransformFinalBlock(data, 0, data.Length);
- String s = Encoding.ASCII.GetString(result);
- return s;
- }
2. MD5
参见http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.md5.aspx
3. 对XML元素的加密和解密
可以使用EncryptedXml类的EncryptData()和DecryptData()等方法。
4. 对配置文件的加密和解密
可以使用SectionInformation类的ProtectSection()和UnprotectSection()方法。
- String configFileName = "文件名";
- System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(configFileName);
- System.Configuration.ConnectionStringsSection section = config.GetSection("connectionStrings") as System.Configuration.ConnectionStringsSection;
- System.Configuration.SectionInformation info = section.SectionInformation;
-
- //加密
- if (!info.IsProtected)
- {
- info.ProtectSection("DataProtectionConfigurationProvider");
- //加密提供程序的名字可以由ProtectedConfiguration类得到,有两个。
- }
-
- //解密
- if (info.IsProtected)
- {
- info.UnprotectSection();
- }