- 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);
- }
- }
- }