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); }
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); }