isotonicq

Untitled

Apr 20th, 2017
118
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Dawid Grzeszuk Prawa Zastrzeżone,aby wykorzystać w programie należy zamieścić informacje o twórcy
  2.  
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Security.Cryptography;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10.  
  11. namespace FoodNavigator___Controller.Data_Encrypter
  12. {
  13.     public static class Enrypter
  14.     {
  15.         private const int Keysize = 256;
  16.  
  17.         private const int DerivationIterations = 1000;
  18.  
  19.         public static string Encrypt(string plainText, string passPhrase)
  20.         {
  21.  
  22.             var saltStringBytes = Generate256BitsOfRandomEntropy();
  23.             var ivStringBytes = Generate256BitsOfRandomEntropy();
  24.             var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
  25.             using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
  26.             {
  27.                 var keyBytes = password.GetBytes(Keysize / 8);
  28.                 using (var symmetricKey = new RijndaelManaged())
  29.                 {
  30.                     symmetricKey.BlockSize = 256;
  31.                     symmetricKey.Mode = CipherMode.CBC;
  32.                     symmetricKey.Padding = PaddingMode.PKCS7;
  33.                     using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes))
  34.                     {
  35.                         using (var memoryStream = new MemoryStream())
  36.                         {
  37.                             using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
  38.                             {
  39.                                 cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
  40.                                 cryptoStream.FlushFinalBlock();
  41.                                 var cipherTextBytes = saltStringBytes;
  42.                                 cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray();
  43.                                 cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray();
  44.                                 memoryStream.Close();
  45.                                 cryptoStream.Close();
  46.                                 return Convert.ToBase64String(cipherTextBytes);
  47.                             }
  48.                         }
  49.                     }
  50.                 }
  51.             }
  52.         }
  53.  
  54.         public static string Decrypt(string cipherText, string passPhrase)
  55.         {
  56.            
  57.             var cipherTextBytesWithSaltAndIv = Convert.FromBase64String(cipherText);
  58.             var saltStringBytes = cipherTextBytesWithSaltAndIv.Take(Keysize / 8).ToArray();    
  59.             var ivStringBytes = cipherTextBytesWithSaltAndIv.Skip(Keysize / 8).Take(Keysize / 8).ToArray();
  60.             var cipherTextBytes = cipherTextBytesWithSaltAndIv.Skip((Keysize / 8) * 2).Take(cipherTextBytesWithSaltAndIv.Length - ((Keysize / 8) * 2)).ToArray();
  61.  
  62.             using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations))
  63.             {
  64.                 var keyBytes = password.GetBytes(Keysize / 8);
  65.                 using (var symmetricKey = new RijndaelManaged())
  66.                 {
  67.                     symmetricKey.BlockSize = 256;
  68.                     symmetricKey.Mode = CipherMode.CBC;
  69.                     symmetricKey.Padding = PaddingMode.PKCS7;
  70.                     using (var decryptor = symmetricKey.CreateDecryptor(keyBytes, ivStringBytes))
  71.                     {
  72.                         using (var memoryStream = new MemoryStream(cipherTextBytes))
  73.                         {
  74.                             using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
  75.                             {
  76.                                 var plainTextBytes = new byte[cipherTextBytes.Length];
  77.                                 var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
  78.                                 memoryStream.Close();
  79.                                 cryptoStream.Close();
  80.                                 return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
  81.                             }
  82.                         }
  83.                     }
  84.                 }
  85.             }
  86.         }
  87.  
  88.         private static byte[] Generate256BitsOfRandomEntropy()
  89.         {
  90.             var randomBytes = new byte[32];
  91.             using (var rngCsp = new RNGCryptoServiceProvider())
  92.             {
  93.                 rngCsp.GetBytes(randomBytes);
  94.             }
  95.             return randomBytes;
  96.         }
  97.     }
  98. }
RAW Paste Data