isotonicq

Untitled

Jan 28th, 2018
134
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  public static class PasswordEncrypter
  2.     {
  3.         private const int Keysize = 256;
  4.  
  5.         private const int DerivationIterations = 1000;
  6.  
  7.         public static string Encrypt(string plainText, string passPhrase)
  8.         {
  9.             var saltStringBytes = Generate256BitsOfRandomEntropy();
  10.             var ivStringBytes = Generate256BitsOfRandomEntropy();
  11.             var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
  12.  
  13.             using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
  14.             {
  15.                 var keyBytes = password.GetBytes(Keysize / 8);
  16.                 using (var symmetricKey = new RijndaelManaged())
  17.                 {
  18.                     symmetricKey.BlockSize = 256;
  19.                     symmetricKey.Mode = CipherMode.CBC;
  20.                     symmetricKey.Padding = PaddingMode.PKCS7;
  21.                     using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes))
  22.                     {
  23.                         using (var memoryStream = new MemoryStream())
  24.                         {
  25.                             using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
  26.                             {
  27.                                 cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
  28.                                 cryptoStream.FlushFinalBlock();
  29.                                 var cipherTextBytes = saltStringBytes;
  30.                                 cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray();
  31.                                 cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray();
  32.                                 memoryStream.Close();
  33.                                 cryptoStream.Close();
  34.                                 return Convert.ToBase64String(cipherTextBytes);
  35.                             }
  36.                         }
  37.                     }
  38.                 }
  39.             }
  40.         }
  41.  
  42.         public static string Decrypt(string cipherText, string passPhrase)
  43.         {
  44.             var cipherTextBytesWithSaltAndIv = Convert.FromBase64String(cipherText);
  45.             var saltStringBytes = cipherTextBytesWithSaltAndIv.Take(Keysize / 8).ToArray();
  46.             var ivStringBytes = cipherTextBytesWithSaltAndIv.Skip(Keysize / 8).Take(Keysize / 8).ToArray();
  47.             var cipherTextBytes = cipherTextBytesWithSaltAndIv.Skip(Keysize / 8 * 2)
  48.                 .Take(cipherTextBytesWithSaltAndIv.Length - Keysize / 8 * 2).ToArray();
  49.  
  50.             using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
  51.             {
  52.                 var keyBytes = password.GetBytes(Keysize / 8);
  53.                 using (var symmetricKey = new RijndaelManaged())
  54.                 {
  55.                     symmetricKey.BlockSize = 256;
  56.                     symmetricKey.Mode = CipherMode.CBC;
  57.                     symmetricKey.Padding = PaddingMode.PKCS7;
  58.                     using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, ivStringBytes))
  59.                     {
  60.                         using (var memoryStream = new MemoryStream(cipherTextBytes))
  61.                         {
  62.                             using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
  63.                             {
  64.                                 var plainTextBytes = new byte[cipherTextBytes.Length];
  65.                                 var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
  66.                                 memoryStream.Close();
  67.                                 cryptoStream.Close();
  68.                                 return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
  69.                             }
  70.                         }
  71.                     }
  72.                 }
  73.             }
  74.         }
  75.  
  76.         private static byte[] Generate256BitsOfRandomEntropy()
  77.         {
  78.             var randomBytes = new byte[32];
  79.             using (var rngCsp = new RNGCryptoServiceProvider())
  80.             {
  81.                 rngCsp.GetBytes(randomBytes);
  82.             }
  83.             return randomBytes;
  84.         }
  85.     }
RAW Paste Data