1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class EncryptedString
{
    /// <summary>
    /// Encrpyts the sourceString, returns this result as an Aes encrpyted, BASE64 encoded string
    /// </summary>
    /// <param name="plainSourceStringToEncrypt">a plain, Framework string (ASCII, null terminated)</param>
    /// <param name="passPhrase">The pass phrase.</param>
    /// <returns>
    /// returns an Aes encrypted, BASE64 encoded string
    /// </returns>
    public static string EncryptString(string plainSourceStringToEncrypt, string passPhrase)
    {
        //Set up the encryption objects
        using (AesCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(passPhrase)))
        {
            byte[] sourceBytes = Encoding.ASCII.GetBytes(plainSourceStringToEncrypt);
            ICryptoTransform ictE = acsp.CreateEncryptor();

            //Set up stream to contain the encryption
            MemoryStream msS = new MemoryStream();

            //Perform the encrpytion, storing output into the stream
            CryptoStream csS = new CryptoStream(msS, ictE, CryptoStreamMode.Write);
            csS.Write(sourceBytes, 0, sourceBytes.Length);
            csS.FlushFinalBlock();

            //sourceBytes are now encrypted as an array of secure bytes
            byte[] encryptedBytes = msS.ToArray(); //.ToArray() is important, don't mess with the buffer

            //return the encrypted bytes as a BASE64 encoded string
            return Convert.ToBase64String(encryptedBytes);
        }
    }


    /// <summary>
    /// Decrypts a BASE64 encoded string of encrypted data, returns a plain string
    /// </summary>
    /// <param name="base64StringToDecrypt">an Aes encrypted AND base64 encoded string</param>
    /// <param name="passphrase">The passphrase.</param>
    /// <returns>returns a plain string</returns>
    public static string DecryptString(string base64StringToDecrypt, string passphrase)
    {
        //Set up the encryption objects
        using (AesCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(passphrase)))
        {
            byte[] RawBytes = Convert.FromBase64String(base64StringToDecrypt);
            ICryptoTransform ictD = acsp.CreateDecryptor();

            //RawBytes now contains original byte array, still in Encrypted state

            //Decrypt into stream
            MemoryStream msD = new MemoryStream(RawBytes, 0, RawBytes.Length);
            CryptoStream csD = new CryptoStream(msD, ictD, CryptoStreamMode.Read);
            //csD now contains original byte array, fully decrypted

            //return the content of msD as a regular string
            return (new StreamReader(csD)).ReadToEnd();
        }
    }

    private static AesCryptoServiceProvider GetProvider(byte[] key)
    {
        AesCryptoServiceProvider result = new AesCryptoServiceProvider();
        result.BlockSize = 128;
        result.KeySize = 128;
        result.Mode = CipherMode.CBC;
        result.Padding = PaddingMode.PKCS7;

        result.GenerateIV();
        result.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

        byte[] RealKey = GetKey(key, result);
        result.Key = RealKey;
        // result.IV = RealKey;
        return result;
    }

    private static byte[] GetKey(byte[] suggestedKey, SymmetricAlgorithm p)
    {
        byte[] kRaw = suggestedKey;
        List<byte> kList = new List<byte>();

        for (int i = 0; i < p.LegalKeySizes[0].MinSize; i += 8)
        {
            kList.Add(kRaw[(i / 8) % kRaw.Length]);
        }
        byte[] k = kList.ToArray();
        return k;
    }


}