| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Security.Cryptography;
- using System.Text;
- using System.Threading.Tasks;
- namespace ErgometerLibrary
- {
- static class AESEncrypt
- {
- // Change these keys
- private static byte[] Key = { 47, 20, 192, 222, 214, 221, 193, 151, 182, 182, 20, 246, 80, 235, 182, 216, 116, 141, 188, 191, 13, 159, 1, 137, 151, 150, 29, 171, 240, 21, 251, 252 };
- private static byte[] Vector = { 147, 16, 78, 223, 97, 189, 43, 197, 244, 102, 242, 123, 184, 101, 75, 203 };
- private static ICryptoTransform EncryptorTransform, DecryptorTransform;
- private static System.Text.UTF8Encoding UTFEncoder;
- static AESEncrypt()
- {
- //This is our encryption method
- RijndaelManaged rm = new RijndaelManaged();
- //Create an encryptor and a decryptor using our encryption method, key, and vector.
- EncryptorTransform = rm.CreateEncryptor(Key, Vector);
- DecryptorTransform = rm.CreateDecryptor(Key, Vector);
- //Used to translate bytes to text and vice versa
- UTFEncoder = new System.Text.UTF8Encoding();
- }
- /// -------------- Two Utility Methods (not used but may be useful) -----------
- /// Generates an encryption key.
- static public byte[] GenerateEncryptionKey()
- {
- //Generate a Key.
- RijndaelManaged rm = new RijndaelManaged();
- rm.GenerateKey();
- return rm.Key;
- }
- /// Generates a unique encryption vector
- static public byte[] GenerateEncryptionVector()
- {
- //Generate a Vector
- RijndaelManaged rm = new RijndaelManaged();
- rm.GenerateIV();
- return rm.IV;
- }
- /// ----------- The commonly used methods ------------------------------
- /// Encrypt some text and return a string suitable for passing in a URL.
- public static string EncryptToString(string TextValue)
- {
- return ByteArrToString(Encrypt(TextValue));
- }
- /// Encrypt some text and return an encrypted byte array.
- public static byte[] Encrypt(string TextValue)
- {
- //Translates our text value into a byte array.
- Byte[] bytes = UTFEncoder.GetBytes(TextValue);
- //Used to stream the data in and out of the CryptoStream.
- MemoryStream memoryStream = new MemoryStream();
- /*
- * We will have to write the unencrypted bytes to the stream,
- * then read the encrypted result back from the stream.
- */
- #region Write the decrypted value to the encryption stream
- CryptoStream cs = new CryptoStream(memoryStream, EncryptorTransform, CryptoStreamMode.Write);
- cs.Write(bytes, 0, bytes.Length);
- cs.FlushFinalBlock();
- #endregion
- #region Read encrypted value back out of the stream
- memoryStream.Position = 0;
- byte[] encrypted = new byte[memoryStream.Length];
- memoryStream.Read(encrypted, 0, encrypted.Length);
- #endregion
- //Clean up.
- cs.Close();
- memoryStream.Close();
- return encrypted;
- }
- /// The other side: Decryption methods
- public static string DecryptString(string EncryptedString)
- {
- return Decrypt(StrToByteArray(EncryptedString));
- }
- /// Decryption when working with byte arrays.
- public static string Decrypt(byte[] EncryptedValue)
- {
- #region Write the encrypted value to the decryption stream
- MemoryStream encryptedStream = new MemoryStream();
- CryptoStream decryptStream = new CryptoStream(encryptedStream, DecryptorTransform, CryptoStreamMode.Write);
- decryptStream.Write(EncryptedValue, 0, EncryptedValue.Length);
- decryptStream.FlushFinalBlock();
- #endregion
- #region Read the decrypted value from the stream.
- encryptedStream.Position = 0;
- Byte[] decryptedBytes = new Byte[encryptedStream.Length];
- encryptedStream.Read(decryptedBytes, 0, decryptedBytes.Length);
- encryptedStream.Close();
- #endregion
- return UTFEncoder.GetString(decryptedBytes);
- }
- /// Convert a string to a byte array. NOTE: Normally we'd create a Byte Array from a string using an ASCII encoding (like so).
- // System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
- // return encoding.GetBytes(str);
- // However, this results in character values that cannot be passed in a URL. So, instead, I just
- // lay out all of the byte values in a long string of numbers (three per - must pad numbers less than 100).
- public static byte[] StrToByteArray(string str)
- {
- if (str.Length == 0)
- throw new Exception("Invalid string value in StrToByteArray");
- byte val;
- byte[] byteArr = new byte[str.Length / 3];
- int i = 0;
- int j = 0;
- do
- {
- val = byte.Parse(str.Substring(i, 3));
- byteArr[j++] = val;
- i += 3;
- }
- while (i < str.Length);
- return byteArr;
- }
- // Same comment as above. Normally the conversion would use an ASCII encoding in the other direction:
- // System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
- // return enc.GetString(byteArr);
- public static string ByteArrToString(byte[] byteArr)
- {
- byte val;
- string tempStr = "";
- for (int i = 0; i <= byteArr.GetUpperBound(0); i++)
- {
- val = byteArr[i];
- if (val < (byte)10)
- tempStr += "00" + val.ToString();
- else if (val < (byte)100)
- tempStr += "0" + val.ToString();
- else
- tempStr += val.ToString();
- }
- return tempStr;
- }
- }
- }
|