public static int[] OneRoundLog(int[] blocksArray, List <string> subKeys, int roundNum, string fileWay)
        {
            StringBuilder strBuild = new StringBuilder();

            string[] blocksName  = { "A", "B", "C", "D" };
            int[]    roundResult = new int[4];
            strBuild.AppendLine();
            strBuild.AppendLine($"-------------------------------Round{roundNum}------------------------------");
            strBuild.AppendLine($"Input blocks: [{blocksName[0]}]: {StringMethods.MyConvertToString(blocksArray[0], 2, 32)};");
            for (int i = 1; i < 4; i++)
            {
                strBuild.AppendLine($"              [{blocksName[i]}]: {StringMethods.MyConvertToString(blocksArray[i], 2, 32)};");
            }
            var stringB = StringMethods.MyConvertToString(blocksArray[1], 2, 32);

            for (int i = 0; i < 8; i++)
            {
                stringB = MyMath.LeftCycleShift(stringB);
            }
            strBuild.AppendLine($"Содержимое субблока B циклически сдвигается влево на 8 бит: [{blocksName[1]}]= {stringB};");
            int shiftedB     = Convert.ToInt32(stringB, 2);
            var blockAafterG = TwofishAlgo.GFunction(StringMethods.MyConvertToString(blocksArray[0], 2, 32));

            strBuild.AppendLine($"Субблок A обрабатывается операцией g(): [{blocksName[0]}]= {blockAafterG};");
            var blockBafterG = TwofishAlgo.GFunction(StringMethods.MyConvertToString(shiftedB, 2, 32));

            strBuild.AppendLine($"Субблок B также обрабатывается операцией g(): [{blocksName[1]}]= {blockBafterG};");
            var blockAandB = (Convert.ToInt32(blockAafterG, 2) + Convert.ToInt32(blockBafterG, 2)) % Math.Pow(2, 32);

            strBuild.AppendLine($"Субблок B накладывается на A с помощью сложения по модулю 232,\n после чего аналогичным образом выполняется наложение субблока A на субблок B: [{blocksName[0]}]= [{blocksName[1]}]= {StringMethods.MyConvertToString((int)blockAandB,2,32)};");
            var APlusKey = blockAandB + Convert.ToInt32(subKeys.ElementAt(2 * roundNum + 8), 2);

            strBuild.AppendLine($"Фрагмент расширенного ключа K2r+8 (где r — номер текущего раунда, начиная с 0) складывается с субблоком A по модулю 232: [{blocksName[0]}] = {StringMethods.MyConvertToString((int)APlusKey, 2, 32)};");
            var BPlusKey = blockAandB + Convert.ToInt32(subKeys.ElementAt(2 * roundNum + 9), 2);

            strBuild.AppendLine($"Аналогично предыдущему шагу, K2r+9 накладывается на субблок B: [{blocksName[1]}] = {StringMethods.MyConvertToString((int)BPlusKey, 2, 32)};");
            blocksArray[2] = blocksArray[2] ^ (int)APlusKey;
            strBuild.AppendLine($"Субблок A накладывается на C операцией XOR: [{blocksName[2]}] = {StringMethods.MyConvertToString(blocksArray[2], 2, 32)};");
            blocksArray[3] = Convert.ToInt32(MyMath.LeftCycleShift(StringMethods.MyConvertToString(blocksArray[3], 2, 32)), 2);
            strBuild.AppendLine($"Содержимое субблока D циклически сдвигается влево на 1 бит: [{blocksName[3]}] = {StringMethods.MyConvertToString(blocksArray[3], 2, 32)};");
            blocksArray[3] = blocksArray[3] ^ (int)BPlusKey;
            strBuild.AppendLine($"Субблок B накладывается на D операцией XOR: [{blocksName[3]}] = {StringMethods.MyConvertToString(blocksArray[3], 2, 32)};");
            blocksArray[2] = Convert.ToInt32(MyMath.RightCycleShift(StringMethods.MyConvertToString(blocksArray[2], 2, 32)), 2);
            strBuild.AppendLine($"Содержимое субблока C циклически сдвигается вправо на 1 бит: [{blocksName[2]}] = {StringMethods.MyConvertToString(blocksArray[2], 2, 32)};");
            roundResult[0] = blocksArray[2];
            roundResult[1] = blocksArray[3];
            roundResult[2] = blocksArray[0];
            roundResult[3] = blocksArray[1];
            strBuild.AppendLine($"Output blocks: [{blocksName[0]}]: {StringMethods.MyConvertToString(roundResult[0], 2, 32)};");
            for (int i = 1; i < 4; i++)
            {
                strBuild.AppendLine($"              [{blocksName[i]}]: {StringMethods.MyConvertToString(roundResult[i], 2, 32)};");
            }

            File.AppendAllText(fileWay, strBuild.ToString());
            return(roundResult);
        }
Exemplo n.º 2
0
        private void Encode_Click(object sender, EventArgs e)
        {
            //var len = TwofishAlgo.testKey.Length;
            var           openMessage    = File.ReadAllText(@WayFrom.Text);
            var           openMessageBin = StringMethods.ConvertTextToBinString(openMessage);
            List <string> encodedBlocks  = new List <string>();
            List <byte>   intViewOfBytes = new List <byte>();
            string        result         = "";

            //byte[] bytesResult = new byte[];
            if (openMessageBin.Length % 128 != 0)
            {
                for (int i = openMessageBin.Length % 128; i < 128; i++)
                {
                    openMessageBin += "0";
                }
            }
            var blocks128bit = StringMethods.StringToList(openMessageBin, 128);

            foreach (string block in blocks128bit)
            {
                encodedBlocks.Add(TwofishAlgo.Cyphering(block, TwofishAlgo.testKey));
            }
            var binaryResultString = StringMethods.ListToString(encodedBlocks);
            var bytesResultHashset = StringMethods.StringToList(binaryResultString, 8);

            foreach (string resultByte in bytesResultHashset)
            {
                intViewOfBytes.Add(Convert.ToByte(Convert.ToInt32(resultByte, 2)));
            }

            var      arrayOfBytes = intViewOfBytes.ToArray();
            Encoding encoding     = Encoding.GetEncoding(1251);

            for (int i = 0; i < arrayOfBytes.Count(); i++)
            {
                byte [] oneByte = new byte[1];
                oneByte [0] = arrayOfBytes[i];
                result     += encoding.GetString(oneByte);
            }
            File.WriteAllText(WayTo.Text, result, Encoding.UTF8);
            var    fileName = Convert.ToString(DateTime.Now).Replace(":", "_");
            string keyPath  = "G:\\KINGSTON\\8 сем\\КМЗИ\\лаб3+дз\\" + fileName + ".txt";

            File.WriteAllText(keyPath, TwofishAlgo.testKey);
        }
        private void Decypher_Click(object sender, EventArgs e)
        {
            var           closedMessage    = File.ReadAllText(@WayFrom.Text);
            var           key              = File.ReadAllText(@KeyWay.Text);
            var           closedMessageBin = StringMethods.ConvertTextToBinString(closedMessage);
            List <string> decodedBlocks    = new List <string>();
            List <byte>   intViewOfBytes   = new List <byte>();
            string        result           = "";

            if (closedMessageBin.Length % 128 != 0)
            {
                for (int i = closedMessageBin.Length % 128; i < 128; i++)
                {
                    closedMessageBin += "0";
                }
            }
            var blocks128bit = StringMethods.StringToList(closedMessageBin, 128);

            foreach (string block in blocks128bit)
            {
                decodedBlocks.Add(TwofishAlgo.Decyphering(block, key));
            }
            var binaryResultString = StringMethods.ListToString(decodedBlocks);
            var bytesResultHashset = StringMethods.StringToList(binaryResultString, 8);

            foreach (string resultByte in bytesResultHashset)
            {
                intViewOfBytes.Add(Convert.ToByte(Convert.ToInt32(resultByte, 2)));
            }

            var      arrayOfBytes = intViewOfBytes.ToArray();
            Encoding encoding     = Encoding.GetEncoding(1251);

            for (int i = 0; i < arrayOfBytes.Count(); i++)
            {
                byte[] oneByte = new byte[1];
                oneByte[0] = arrayOfBytes[i];
                result    += encoding.GetString(oneByte);
            }
            File.WriteAllText(WayTo.Text, result, Encoding.UTF8);
        }