首页 > 代码库 > Encryp and decrypt a string
Encryp and decrypt a string
1 using System; 2 using System.IO; 3 using System.Security.Cryptography; 4 using System.Text; 5 6 namespace Utility 7 { 8 /// <summary> 9 /// http://stackoverflow.com/questions/202011/encrypt-and-decrypt-a-string 10 /// </summary> 11 public class Encryptor 12 { 13 private static byte[] _salt = Encoding.ASCII.GetBytes("o6806642kbM7c5"); // update by yourself 14 15 public static string Encrypt(string text) 16 { 17 var s = DateTime.Now.Year.ToString().Substring(0, 2); 18 return EncryptStringAES(text, s); 19 } 20 21 public static string Decrypt(string text) 22 { 23 var s = DateTime.Now.Year.ToString().Substring(0, 2); 24 return DecryptStringAES(text, s); 25 } 26 27 /// <summary> 28 /// Encrypt the given string using AES. The string can be decrypted using 29 /// DecryptStringAES(). The sharedSecret parameters must match. 30 /// </summary> 31 /// <param name="plainText">The text to encrypt.</param> 32 /// <param name="sharedSecret">A password used to generate a key for encryption.</param> 33 public static string EncryptStringAES(string plainText, string sharedSecret) 34 { 35 if (string.IsNullOrEmpty(plainText)) 36 throw new ArgumentNullException("plainText"); 37 if (string.IsNullOrEmpty(sharedSecret)) 38 throw new ArgumentNullException("sharedSecret"); 39 40 string outStr = null; // Encrypted string to return 41 RijndaelManaged aesAlg = null; // RijndaelManaged object used to encrypt the data. 42 43 try 44 { 45 // generate the key from the shared secret and the salt 46 Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt); 47 48 // Create a RijndaelManaged object 49 aesAlg = new RijndaelManaged(); 50 aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8); 51 52 // Create a decryptor to perform the stream transform. 53 ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 54 55 // Create the streams used for encryption. 56 using (MemoryStream msEncrypt = new MemoryStream()) 57 { 58 // prepend the IV 59 msEncrypt.Write(BitConverter.GetBytes(aesAlg.IV.Length), 0, sizeof(int)); 60 msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length); 61 using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 62 { 63 using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 64 { 65 //Write all data to the stream. 66 swEncrypt.Write(plainText); 67 } 68 } 69 outStr = Convert.ToBase64String(msEncrypt.ToArray()); 70 } 71 } 72 finally 73 { 74 // Clear the RijndaelManaged object. 75 if (aesAlg != null) 76 aesAlg.Clear(); 77 } 78 79 // Return the encrypted bytes from the memory stream. 80 return outStr; 81 } 82 83 /// <summary> 84 /// Decrypt the given string. Assumes the string was encrypted using 85 /// EncryptStringAES(), using an identical sharedSecret. 86 /// </summary> 87 /// <param name="cipherText">The text to decrypt.</param> 88 /// <param name="sharedSecret">A password used to generate a key for decryption.</param> 89 public static string DecryptStringAES(string cipherText, string sharedSecret) 90 { 91 if (string.IsNullOrEmpty(cipherText)) 92 throw new ArgumentNullException("cipherText"); 93 if (string.IsNullOrEmpty(sharedSecret)) 94 throw new ArgumentNullException("sharedSecret"); 95 96 // Declare the RijndaelManaged object 97 // used to decrypt the data. 98 RijndaelManaged aesAlg = null; 99 100 // Declare the string used to hold101 // the decrypted text.102 string plaintext = null;103 104 try105 {106 // generate the key from the shared secret and the salt107 Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);108 109 // Create the streams used for decryption.110 byte[] bytes = Convert.FromBase64String(cipherText);111 using (MemoryStream msDecrypt = new MemoryStream(bytes))112 {113 // Create a RijndaelManaged object114 // with the specified key and IV.115 aesAlg = new RijndaelManaged();116 aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);117 // Get the initialization vector from the encrypted stream118 aesAlg.IV = ReadByteArray(msDecrypt);119 // Create a decrytor to perform the stream transform.120 ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);121 using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))122 {123 using (StreamReader srDecrypt = new StreamReader(csDecrypt))124 125 // Read the decrypted bytes from the decrypting stream126 // and place them in a string.127 plaintext = srDecrypt.ReadToEnd();128 }129 }130 }131 finally132 {133 // Clear the RijndaelManaged object.134 if (aesAlg != null)135 aesAlg.Clear();136 }137 138 return plaintext;139 }140 141 private static byte[] ReadByteArray(Stream s)142 {143 byte[] rawLength = new byte[sizeof(int)];144 if (s.Read(rawLength, 0, rawLength.Length) != rawLength.Length)145 {146 throw new SystemException("Stream did not contain properly formatted byte array");147 }148 149 byte[] buffer = new byte[BitConverter.ToInt32(rawLength, 0)];150 if (s.Read(buffer, 0, buffer.Length) != buffer.Length)151 {152 throw new SystemException("Did not read byte array properly");153 }154 155 return buffer;156 }157 }158 }
Encryp and decrypt a string
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。