- using System;
- using System.Security.Cryptography;
- using System.IO;
- using System.Text;
- //1、将字符串转换成字节数组
- //2、选择加密方式
- //3、不可逆加密:MD5、SHA1
- //4、可逆加密:DES、RC2、Rijndael
- //5、对密钥要求长度不同
- //6、加密速度不同、复杂程度不同、安全性不同
- public class Class10
- {
- public Class10()
- {
- CallMyDES();
- }
- void CallMyDES()
- {
- Byte[] key = { 12, 23, 34, 45, 56, 67, 78, 89 };
- Byte[] iv = { 120, 230, 10, 1, 10, 20, 30, 40 };
- //1、调用MD5、SHA1加密
- bool result = MyMD5Crypto("123456");
- //2、调用DES加密、解密
- string a = MyDESCrypto("123456", key, iv);
- string b = MyDESCryptoDe(a, key, iv);
- //3、调用DES对文件加密、解密
- MyDESCryptoFile("123456", key, iv);
- string str = MyDESCryptoFileDe(key, iv);
- //4、调用TripleDES加密、解密
- string a1 = TripleDESCrypto("中国", "8i9o0p-[=]'/;.l,");//天津香港澳门台湾
- string b1 = TripleDESCryptoDe(a1, "8i9o0p-[=]'/;.l,");
- //5、调用自定义加密、解密
- MyCrypto();
- ////rsa比 dea慢,但比dsa安全
- //DSA dsa = DSA.Create();
- //RSA rea = RSA.Create();
- ////64
- //DES des = DES.Create();
- //TripleDES tDes = TripleDES.Create();
- //RC2 rc2 = RC2.Create();
- ////或
- //RC2 rc21 = (RC2)SymmetricAlgorithm.Create("RC2");
- //Rijndael rjd = Rijndael.Create();
- //MD5 md5 = MD5.Create();
- //SHA1 sha1 = SHA1.Create();
- }
- //1、MD5、SHA1加密(可用于加密后的数据以后不再显示,如加密用户密码)
- bool MyMD5Crypto(string userPassword)//"123456";
- {
- bool result = false;
- //单向加密
- //1、MD5
- string dbPassword = "E10ADC3949BA59ABBE56E057F20F883E";
- string md5Password = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(userPassword, "MD5");
- if (md5Password == dbPassword)
- {
- result = true;
- }
- //2、SHA1
- string sha1Password = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(userPassword, "SHA1");
- //"7C4A8D09CA3762AF61E59520943DC26494F8941B"
- return result;
- }
- //2、DES对字符串加密、解密
- string MyDESCrypto(string str, byte[] keys, byte[] ivs)
- {
- //加密
- byte[] strs = Encoding.Unicode.GetBytes(str);
- DESCryptoServiceProvider desc = new DESCryptoServiceProvider();
- MemoryStream mStream = new MemoryStream();
- ICryptoTransform transform = desc.CreateEncryptor(keys, ivs);//加密对象
- CryptoStream cStream = new CryptoStream(mStream, transform, CryptoStreamMode.Write);
- cStream.Write(strs, 0, strs.Length);
- cStream.FlushFinalBlock();
- return Convert.ToBase64String(mStream.ToArray());
- }
- string MyDESCryptoDe(string str, byte[] keys, byte[] ivs)
- {
- //解密
- byte[] strs = Convert.FromBase64String(str);
- DESCryptoServiceProvider desc = new DESCryptoServiceProvider();
- MemoryStream mStream = new MemoryStream();
- ICryptoTransform transform = desc.CreateDecryptor(keys, ivs);//解密对象
- CryptoStream cStream = new CryptoStream(mStream, transform, CryptoStreamMode.Write);
- cStream.Write(strs, 0, strs.Length);
- cStream.FlushFinalBlock();
- return Encoding.Unicode.GetString(mStream.ToArray());
- }
- //3、DSA对文件加密、解密
- void MyDESCryptoFile(string str, Byte[] key, Byte[] iv)
- {
- Byte[] inputStr = Encoding.Unicode.GetBytes(str);
- //
- DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
- ICryptoTransform transform = provider.CreateEncryptor(key, iv);//加密对象
- FileStream fStream = new FileStream(@"D:\a.txt", FileMode.Create, FileAccess.Write);
- CryptoStream cStream = new CryptoStream(fStream, transform, CryptoStreamMode.Write);
- cStream.Write(inputStr, 0, inputStr.Length);
- cStream.Close();
- }
- string MyDESCryptoFileDe(Byte[] key, Byte[] iv)
- {
- DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
- ICryptoTransform transform = provider.CreateDecryptor(key, iv);//解密对象
- FileStream fStream = new FileStream(@"D:\a.txt", FileMode.Open, FileAccess.Read);
- CryptoStream cStream = new CryptoStream(fStream, transform, CryptoStreamMode.Read);
- StreamReader reader = new StreamReader(cStream, new UnicodeEncoding());
- string str = reader.ReadToEnd();
- cStream.Close();
- return str;
- }
- //4、TripleDES加密、解密
- string TripleDESCrypto(string str, string key)
- {
- byte[] data = UnicodeEncoding.Unicode.GetBytes(str);//如果加密中文,不能用ASCII码
- byte[] keys = ASCIIEncoding.ASCII.GetBytes(key);
- TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
- des.Key = keys;//key的长度必须为16位或24位,否则报错“指定键的大小对于此算法无效。”,des.Key不支持中文
- des.Mode = CipherMode.ECB;//设置运算模式
- ICryptoTransform cryp = des.CreateEncryptor();//加密
- return Convert.ToBase64String(cryp.TransformFinalBlock(data, 0, data.Length));
- }
- string TripleDESCryptoDe(string str, string key)
- {
- byte[] data = Convert.FromBase64String(str);
- byte[] keys = ASCIIEncoding.ASCII.GetBytes(key);
- TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
- des.Key = keys;
- des.Mode = CipherMode.ECB;//设置运算模式
- des.Padding = PaddingMode.PKCS7;
- ICryptoTransform cryp = des.CreateDecryptor();//解密
- return UnicodeEncoding.Unicode.GetString(cryp.TransformFinalBlock(data, 0, data.Length));
- }
- //5、自定义加密、解密
- void MyCrypto()
- {
- string a = "123456中国";
- string b = "";
- //加密
- for (int i = 0; i < a.Length; i++)
- {
- b += (char)(a[i] + 10 - 2 * 3);
- }
- //解密
- string c = "";
- for (int i = 0; i < a.Length; i++)
- {
- c += (char)(b[i] - 10 + 2 * 3);
- }
- }
- }