Example #1
0
        public override string Encrypt(string plainText, string key)
        {
            MatrixOP mp = new MatrixOP();

            string[,] S_Box = new string[, ]
            {
                { "63", "7c", "77", "7b", "f2", "6b", "6f", "c5", "30", "01", "67", "2b", "fe", "d7", "ab", "76" },
                { "ca", "82", "c9", "7d", "fa", "59", "47", "f0", "ad", "d4", "a2", "af", "9c", "a4", "72", "c0" },
                { "b7", "fd", "93", "26", "36", "3f", "f7", "cc", "34", "a5", "e5", "f1", "71", "d8", "31", "15" },
                { "04", "c7", "23", "c3", "18", "96", "05", "9a", "07", "12", "80", "e2", "eb", "27", "b2", "75" },
                { "09", "83", "2c", "1a", "1b", "6e", "5a", "a0", "52", "3b", "d6", "b3", "29", "e3", "2f", "84" },
                { "53", "d1", "00", "ed", "20", "fc", "b1", "5b", "6a", "cb", "be", "39", "4a", "4c", "58", "cf" },
                { "d0", "ef", "aa", "fb", "43", "4d", "33", "85", "45", "f9", "02", "7f", "50", "3c", "9f", "a8" },
                { "51", "a3", "40", "8f", "92", "9d", "38", "f5", "bc", "b6", "da", "21", "10", "ff", "f3", "d2" },
                { "cd", "0c", "13", "ec", "5f", "97", "44", "17", "c4", "a7", "7e", "3d", "64", "5d", "19", "73" },
                { "60", "81", "4f", "dc", "22", "2a", "90", "88", "46", "ee", "b8", "14", "de", "5e", "0b", "db" },
                { "e0", "32", "3a", "0a", "49", "06", "24", "5c", "c2", "d3", "ac", "62", "91", "95", "e4", "79" },
                { "e7", "c8", "37", "6d", "8d", "d5", "4e", "a9", "6c", "56", "f4", "ea", "65", "7a", "ae", "08" },
                { "ba", "78", "25", "2e", "1c", "a6", "b4", "c6", "e8", "dd", "74", "1f", "4b", "bd", "8b", "8a" },
                { "70", "3e", "b5", "66", "48", "03", "f6", "0e", "61", "35", "57", "b9", "86", "c1", "1d", "9e" },
                { "e1", "f8", "98", "11", "69", "d9", "8e", "94", "9b", "1e", "87", "e9", "ce", "55", "28", "df" },
                { "8c", "a1", "89", "0d", "bf", "e6", "42", "68", "41", "99", "2d", "0f", "b0", "54", "bb", "16" }
            };
            string[] Bin = new string[] { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010"
                                          , "1011", "1100", "1101", "1110", "1111" };
            string dec = "0123456789abcdef";

            string[,] Rcon = new string[, ] {
                { "01", "02", "04", "08", "10", "20", "40", "80", "1b", "36" },
                { "00", "00", "00", "00", "00", "00", "00", "00", "00", "00" },
                { "00", "00", "00", "00", "00", "00", "00", "00", "00", "00" },
                { "00", "00", "00", "00", "00", "00", "00", "00", "00", "00" }
            };
            Dictionary <char, string> Cov    = new Dictionary <char, string>();
            Dictionary <string, char> COVDec = new Dictionary <string, char>();
            Dictionary <char, int>    subB   = new Dictionary <char, int>();

            for (int i = 0; i < dec.Length; i++)
            {
                Cov[dec[i]]    = Bin[i];
                COVDec[Bin[i]] = dec[i];
                subB[dec[i]]   = i;
            }
            string[,] PLaintTextMat = new string[4, 4];
            string[,] KeyMat        = new string[4, 4];
            string[,] AddRoundKey   = new string[4, 4];
            string[,] SubBytes      = new string[4, 4];
            string[,] W             = new string[4, 4];
            string[,] Keycopy       = new string[4, 4];
            string[,] str           = new string[4, 4];
            int           len1          = (plainText.Length / 2 + (plainText.Length % 2 == 0 ? 0 : 1));
            int           len2          = (key.Length / 2 + (key.Length % 2 == 0 ? 0 : 1));
            List <string> KeyWithoutX   = new List <string>();
            List <string> plainWithoutX = new List <string>();

            ///////////////////////////////////////////////////////////
            for (int i = 0; i < len1; i++)
            {
                string ch = plainText.Substring(i * 2, i * 2 + 2 > plainText.Length ? 1 : 2).ToLower();
                if (ch == "0x")
                {
                    continue;
                }
                else
                {
                    plainWithoutX.Add(ch);
                }
            }
            for (int i = 0; i < len2; i++)
            {
                string ch = key.Substring(i * 2, i * 2 + 2 > key.Length ? 1 : 2).ToLower();
                if (ch == "0x")
                {
                    continue;
                }
                else
                {
                    KeyWithoutX.Add(ch);
                }
            }
            //////////////////////////////////////////////
            int cn = 0;

            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    PLaintTextMat[j, i] = plainWithoutX[cn];
                    KeyMat[j, i]        = KeyWithoutX[cn];
                    cn++;
                }
            }
            /////////////////////Add Round Key/////////////////////////////
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    AddRoundKey[i, j] = COVDec[mp.XOR(Cov[PLaintTextMat[i, j][0]], Cov[KeyMat[i, j][0]])].ToString() +
                                        COVDec[mp.XOR(Cov[PLaintTextMat[i, j][1]], Cov[KeyMat[i, j][1]])].ToString();
                }
            }
            ///////////////////////////////rounds///////////////////////////////////////
            for (int round = 0; round < 9; round++)
            {
                /////////////////////////////SubBytes////////////////////////////
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        SubBytes[i, j] = S_Box[subB[AddRoundKey[i, j][0]], subB[AddRoundKey[i, j][1]]];
                    }
                }
                /////////////////////////////////////shiftRows//////////////////////////////////////////
                for (int i = 1; i < 4; i++)
                {
                    int c = i;
                    while (c > 0)
                    {
                        string temp = SubBytes[i, 0];
                        for (int j = 1; j < 4; j++)
                        {
                            SubBytes[i, j - 1] = SubBytes[i, j];
                        }
                        SubBytes[i, 3] = temp;
                        c--;
                    }
                }
                /////////////////////////////MixColumn////////////////////////////////////
                int[,] decnum = new int[4, 4];
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        int de = int.Parse(SubBytes[i, j], System.Globalization.NumberStyles.HexNumber);
                        decnum[i, j] = de;
                    }
                }

                byte[,] B = new byte[4, 4];
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        B[i, j] = byte.Parse(decnum[i, j].ToString());
                    }
                }
                byte[,] BB = mp.MixColumns(B);
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        if (BB[i, j].ToString("X").ToLower().Length < 2)
                        {
                            str[i, j] = "0" + BB[i, j].ToString("X").ToLower();
                        }
                        else
                        {
                            str[i, j] = BB[i, j].ToString("X").ToLower();
                        }
                    }
                }
                ///////////////////////////////AddRoundKey/////////////////////////////////
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        Keycopy[i, j] = KeyMat[i, j];
                    }
                }
                string tem = KeyMat[0, KeyMat.GetLength(0) - 1];
                for (int i = 1; i < 4; i++)
                {
                    KeyMat[i - 1, KeyMat.GetLength(0) - 1] = KeyMat[i, KeyMat.GetLength(0) - 1];
                }
                KeyMat[KeyMat.GetLength(0) - 1, KeyMat.GetLength(0) - 1] = tem;
                for (int i = 0; i < Rcon.GetLength(0); i++)
                {
                    KeyMat[i, KeyMat.GetLength(0) - 1] = S_Box[subB[KeyMat[i, KeyMat.GetLength(0) - 1][0]], subB[KeyMat[i, KeyMat.GetLength(0) - 1][1]]];
                }
                for (int i = 0; i < 4; i++)
                {
                    string c1 = COVDec[mp.XOR(Cov[KeyMat[i, 0][0]], Cov[KeyMat[i, KeyMat.GetLength(0) - 1][0]])].ToString();
                    string c2 = COVDec[mp.XOR(Cov[KeyMat[i, 0][1]], Cov[KeyMat[i, KeyMat.GetLength(0) - 1][1]])].ToString();
                    W[i, 0] = COVDec[mp.XOR(Cov[c1[0]], Cov[Rcon[i, round][0]])].ToString() + COVDec[mp.XOR(Cov[c2[0]], Cov[Rcon[i, round][1]])].ToString();
                }
                for (int i = 1; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        string ch1 = COVDec[mp.XOR(Cov[Keycopy[j, i][0]], Cov[W[j, i - 1][0]])].ToString();
                        string ch2 = COVDec[mp.XOR(Cov[Keycopy[j, i][1]], Cov[W[j, i - 1][1]])].ToString();
                        W[j, i] = ch1 + ch2;
                    }
                }
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        KeyMat[i, j] = W[i, j];
                    }
                }
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        string cs1 = COVDec[mp.XOR(Cov[str[j, i][0]], Cov[KeyMat[j, i][0]])].ToString();
                        string cs2 = COVDec[mp.XOR(Cov[str[j, i][1]], Cov[KeyMat[j, i][1]])].ToString();
                        AddRoundKey[j, i] = cs1 + cs2;
                    }
                }
            }
            /////////////////////////////SubBytes////////////////////////////
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    SubBytes[i, j] = S_Box[subB[AddRoundKey[i, j][0]], subB[AddRoundKey[i, j][1]]];
                }
            }
            /////////////////////////////////////shiftRows//////////////////////////////////////////
            for (int i = 1; i < 4; i++)
            {
                int c = i;
                while (c > 0)
                {
                    string temp = SubBytes[i, 0];
                    for (int j = 1; j < 4; j++)
                    {
                        SubBytes[i, j - 1] = SubBytes[i, j];
                    }
                    SubBytes[i, 3] = temp;
                    c--;
                }
            }

            ///////////////////////////////////////////////////////////////
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    Keycopy[i, j] = KeyMat[i, j];
                }
            }
            string te = KeyMat[0, KeyMat.GetLength(0) - 1];

            for (int i = 1; i < 4; i++)
            {
                KeyMat[i - 1, KeyMat.GetLength(0) - 1] = KeyMat[i, KeyMat.GetLength(0) - 1];
            }
            KeyMat[KeyMat.GetLength(0) - 1, KeyMat.GetLength(0) - 1] = te;
            for (int i = 0; i < Rcon.GetLength(0); i++)
            {
                KeyMat[i, KeyMat.GetLength(0) - 1] = S_Box[subB[KeyMat[i, KeyMat.GetLength(0) - 1][0]], subB[KeyMat[i, KeyMat.GetLength(0) - 1][1]]];
            }
            for (int i = 0; i < 4; i++)
            {
                string c1 = COVDec[mp.XOR(Cov[KeyMat[i, 0][0]], Cov[KeyMat[i, KeyMat.GetLength(0) - 1][0]])].ToString();
                string c2 = COVDec[mp.XOR(Cov[KeyMat[i, 0][1]], Cov[KeyMat[i, KeyMat.GetLength(0) - 1][1]])].ToString();
                W[i, 0] = COVDec[mp.XOR(Cov[c1[0]], Cov[Rcon[i, 9][0]])].ToString() + COVDec[mp.XOR(Cov[c2[0]], Cov[Rcon[i, 9][1]])].ToString();
            }
            for (int i = 1; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    string ch1 = COVDec[mp.XOR(Cov[Keycopy[j, i][0]], Cov[W[j, i - 1][0]])].ToString();
                    string ch2 = COVDec[mp.XOR(Cov[Keycopy[j, i][1]], Cov[W[j, i - 1][1]])].ToString();
                    W[j, i] = ch1 + ch2;
                }
            }
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    KeyMat[i, j] = W[i, j];
                }
            }
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    string cs1 = COVDec[mp.XOR(Cov[SubBytes[j, i][0]], Cov[KeyMat[j, i][0]])].ToString();
                    string cs2 = COVDec[mp.XOR(Cov[SubBytes[j, i][1]], Cov[KeyMat[j, i][1]])].ToString();
                    AddRoundKey[j, i] = cs1 + cs2;
                }
            }
            string CipherText = "";

            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    CipherText += AddRoundKey[j, i];
                }
            }
            return("0x" + CipherText.ToUpper());
        }