public static string Decyphering(string closedMessageBlockDuoSS, string key) { int[] blocksBeforeInputWhiting = new int[4]; Int32[] blocksBeforeOutputWhiting = new Int32[4]; List <string> openMessage = new List <string>(); var subkeysArr = SubkeysGen.SubKeysGeneration(key); var XDataBlocks = StringMethods.StringToList(closedMessageBlockDuoSS, XBlockLength); for (int i = 0; i < 4; i++) { blocksBeforeOutputWhiting[i] = Convert.ToInt32(XDataBlocks[i], 2) ^ Convert.ToInt32(subkeysArr[i + 36], 2); } for (int round = 15; round > -1; round--) { blocksBeforeOutputWhiting = OneRoundReverse(blocksBeforeOutputWhiting, subkeysArr, round); } for (int i = 0; i < 4; i++) { blocksBeforeInputWhiting[i] = blocksBeforeOutputWhiting[i] ^ Convert.ToInt32(subkeysArr[i], 2); openMessage.Add(StringMethods.MyConvertToString(blocksBeforeInputWhiting[i], 2, 32)); } var resultStringDuoSS = StringMethods.ListToString(openMessage); return(resultStringDuoSS); }
public static string Cyphering(string openMessageBlockDuoSS, string key) { int [] blocksAfterInputWhiting = new int [4]; int [] blocksAfterOutputWhiting = new int [4]; List <string> closedMessage = new List <string>(); var subkeysArr = SubkeysGen.SubKeysGeneration(key); var XDataBlocks = StringMethods.StringToList(openMessageBlockDuoSS, XBlockLength); for (int i = 0; i < 4; i++) { blocksAfterInputWhiting[i] = Convert.ToInt32(XDataBlocks[i], 2) ^ Convert.ToInt32(subkeysArr[i], 2); } for (int round = 0; round < 16; round++) { blocksAfterInputWhiting = OneRound(blocksAfterInputWhiting, subkeysArr, round); } for (int i = 0; i < 4; i++) { blocksAfterOutputWhiting[i] = blocksAfterInputWhiting[i] ^ Convert.ToInt32(subkeysArr[i + 36], 2); closedMessage.Add(StringMethods.MyConvertToString(blocksAfterOutputWhiting[i], 2, 32)); } var resultStringDuoSS = StringMethods.ListToString(closedMessage); return(resultStringDuoSS); }
public static int[] OneRoundReverse(int[] blocksArray, List <string> subKeys, int roundNum) { int[] roundResult = new int[4]; int shiftedD = blocksArray[3]; for (int i = 0; i < 8; i++) { shiftedD = Convert.ToInt32(MyMath.LeftCycleShift(StringMethods.MyConvertToString(shiftedD, 2, 32)), 2); } var blockCafterG = GFunction(StringMethods.MyConvertToString(blocksArray[2], 2, 32)); var blockDafterG = GFunction(StringMethods.MyConvertToString(shiftedD, 2, 32)); var blockCandD = (Convert.ToInt32(blockCafterG, 2) + Convert.ToInt32(blockDafterG, 2)) % Math.Pow(2, 32); var CPlusKey = blockCandD + Convert.ToInt32(subKeys.ElementAt(2 * roundNum + 8), 2); var DPlusKey = blockCandD + Convert.ToInt32(subKeys.ElementAt(2 * roundNum + 9), 2); blocksArray[0] = Convert.ToInt32(MyMath.LeftCycleShift(StringMethods.MyConvertToString(blocksArray[0], 2, 32)), 2); blocksArray[1] = blocksArray[1] ^ (int)DPlusKey; blocksArray[1] = Convert.ToInt32(MyMath.RightCycleShift(StringMethods.MyConvertToString(blocksArray[1], 2, 32)), 2); blocksArray[0] = blocksArray[0] ^ (int)CPlusKey; roundResult[0] = blocksArray[2]; roundResult[1] = blocksArray[3]; roundResult[2] = blocksArray[0]; roundResult[3] = blocksArray[1]; return(roundResult); }
public static int[] OneRound(int [] blocksArray, List <string> subKeys, int roundNum) { int [] roundResult = new int [4]; var stringB = StringMethods.MyConvertToString(blocksArray[1], 2, 32); for (int i = 0; i < 8; i++) { stringB = MyMath.LeftCycleShift(stringB); } int shiftedB = Convert.ToInt32(stringB, 2); var blockAafterG = GFunction(StringMethods.MyConvertToString(blocksArray[0], 2, 32)); var blockBafterG = GFunction(StringMethods.MyConvertToString(shiftedB, 2, 32)); var blockAandB = (Convert.ToInt32(blockAafterG, 2) + Convert.ToInt32(blockBafterG, 2)) % Math.Pow(2, 32); var APlusKey = blockAandB + Convert.ToInt32(subKeys.ElementAt(2 * roundNum + 8), 2); var BPlusKey = blockAandB + Convert.ToInt32(subKeys.ElementAt(2 * roundNum + 9), 2); blocksArray[2] = blocksArray[2] ^ (int)APlusKey; blocksArray[3] = Convert.ToInt32(MyMath.LeftCycleShift(StringMethods.MyConvertToString(blocksArray[3], 2, 32)), 2); blocksArray[3] = blocksArray[3] ^ (int)BPlusKey; blocksArray[2] = Convert.ToInt32(MyMath.RightCycleShift(StringMethods.MyConvertToString(blocksArray[2], 2, 32)), 2); roundResult[0] = blocksArray[2]; roundResult[1] = blocksArray[3]; roundResult[2] = blocksArray[0]; roundResult[3] = blocksArray[1]; return(roundResult); }
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); }
public static string ConvertTextToBinString(string textMessage) { var bytesData = Encoding.Default.GetBytes(textMessage); string openMessageBin = ""; for (int i = 0; i < bytesData.Length; i++) { openMessageBin += (StringMethods.MyConvertToString(Convert.ToInt32(bytesData[i]), 2, 8)); } return(openMessageBin); }
public static void LogEncrypt(string key, string openMes, string fileWay) { StringBuilder strBuild = new StringBuilder(); int[] blocksAfterInputWhiting = new int[4]; int[] blocksAfterOutputWhiting = new int[4]; List <string> closedMessage = new List <string>(); var subkeysArr = SubkeysGen.SubKeysGeneration(key); strBuild.AppendLine($"Open message block: {openMes};"); strBuild.AppendLine($"Key({key.Length.ToString()}): {key};"); strBuild.AppendLine($"RoundKeys: {subkeysArr[0]};"); for (int i = 1; i < 40; i++) { strBuild.AppendLine($" {subkeysArr[i]};"); } var XDataBlocks = StringMethods.StringToList(openMes, TwofishAlgo.XBlockLength); strBuild.AppendLine(); strBuild.AppendLine($"**************************Input Whiting**************************"); strBuild.AppendLine(); for (int i = 0; i < 4; i++) { blocksAfterInputWhiting[i] = Convert.ToInt32(XDataBlocks[i], 2) ^ Convert.ToInt32(subkeysArr[i], 2); strBuild.AppendLine($"{XDataBlocks[i]} xor {subkeysArr[i]} = {StringMethods.MyConvertToString(blocksAfterInputWhiting[i], 2, 32)};"); } strBuild.AppendLine(); strBuild.AppendLine($"**************************The Main Cycle**************************"); File.AppendAllText(fileWay, strBuild.ToString()); for (int round = 0; round < 16; round++) { blocksAfterInputWhiting = OneRoundLog(blocksAfterInputWhiting, subkeysArr, round, fileWay); } strBuild.AppendLine(); strBuild.AppendLine($"**************************Output Whiting**************************"); strBuild.AppendLine(); for (int i = 0; i < 4; i++) { blocksAfterOutputWhiting[i] = blocksAfterInputWhiting[i] ^ Convert.ToInt32(subkeysArr[i + 36], 2); closedMessage.Add(StringMethods.MyConvertToString(blocksAfterOutputWhiting[i], 2, 32)); strBuild.AppendLine($"{StringMethods.MyConvertToString(blocksAfterInputWhiting[i], 2, 32)} xor {subkeysArr[i+36]} = {StringMethods.MyConvertToString(blocksAfterOutputWhiting[i], 2, 32)};"); } var resultStringDuoSS = StringMethods.ListToString(closedMessage); strBuild.AppendLine($"Closed message block: {resultStringDuoSS};"); }
public static string GFunction(string dataBlock32) { int[,] matrixAfterQ = new int[1, 4]; //int[,] resultArrayStep5 = new int[1, 4]; string block32BitAfterQ = ""; var eightBitBlocks = StringMethods.StringToList(dataBlock32, 8); int blockNum = 0; string gResult = ""; foreach (string subWord in eightBitBlocks) { int y = 0; var a0 = Convert.ToInt32(subWord, 2) / 16; var b0 = Convert.ToInt32(subWord, 2) % 16; var a1 = a0 ^ b0; var b0Nibbles = StringMethods.StringToList(StringMethods.MyConvertToString(b0, 2, 8), SubkeysGen.NibbleLength); foreach (string nibble in b0Nibbles) { MyMath.RightCycleShift(nibble); } var b1 = (a0 ^ Convert.ToInt32(StringMethods.ListToString(b0Nibbles), 2) ^ (8 * a0)) % 16; if (SubkeysGen.qOperationMatrix[4, blockNum] == 0) { var a2 = Convert.ToInt32(SubkeysGen.tItoeForQ0[0, a1], 16); var b2 = Convert.ToInt32(SubkeysGen.tItoeForQ0[1, b1], 16); var a3 = a2 ^ b2; var b2Nibbles = StringMethods.StringToList(StringMethods.MyConvertToString(b2, 2, 8), SubkeysGen.NibbleLength); foreach (string nibble in b2Nibbles) { MyMath.RightCycleShift(nibble); } var b3 = (a2 ^ Convert.ToInt32(StringMethods.ListToString(b2Nibbles), 2) ^ (8 * a2)) % 16; var a4 = Convert.ToInt32(SubkeysGen.tItoeForQ0[2, a3], 16); var b4 = Convert.ToInt32(SubkeysGen.tItoeForQ0[3, b3], 16); y = 16 * a4 + b4; } else { var a2 = Convert.ToInt32(SubkeysGen.tItoeForQ1[0, a1], 16); var b2 = Convert.ToInt32(SubkeysGen.tItoeForQ1[1, b1], 16); var a3 = a2 ^ b2; var b2Nibbles = StringMethods.StringToList(StringMethods.MyConvertToString(b2, 2, 8), SubkeysGen.NibbleLength); foreach (string nibble in b2Nibbles) { MyMath.RightCycleShift(nibble); } var b3 = (a2 ^ Convert.ToInt32(StringMethods.ListToString(b2Nibbles), 2) ^ (8 * a2)) % 16; var a4 = Convert.ToInt32(SubkeysGen.tItoeForQ1[2, a3], 16); var b4 = Convert.ToInt32(SubkeysGen.tItoeForQ1[3, b3], 16); y = 16 * a4 + b4; } block32BitAfterQ += StringMethods.MyConvertToString(y, 2, 32); blockNum++; } var arrayAfterQ = StringMethods.StringToList(block32BitAfterQ, 8); for (int k = 0; k < 4; k++) { matrixAfterQ[0, k] = Convert.ToInt32(arrayAfterQ.ElementAt(k), 2); } //resultArrayStep5 = MyMath.MatrixMultiplication(SubkeysGen.M1Matrix, matrixAfterQ); for (int j = 0; j < 4; j++) { gResult += StringMethods.MyConvertToString(matrixAfterQ[0, j], 2, 8); } return(gResult); }
public static List <string> SubKeysGeneration(string key) { if (key.Length < 128) { while (key.Length != 128) { key = key.Insert(0, "0"); } } else if (key.Length < 192) { while (key.Length != 192) { key = key.Insert(0, "0"); } } else if (key.Length < 256) { while (key.Length != 256) { key = key.Insert(0, "0"); } } var forCalculations = key.Length / 64; var bigMKeyBlocks = StringMethods.StringToList(key, XBlockLength); var lilMKeyBlocksBin = StringMethods.StringToList(key, byteLength); int[] arrayV = new int[forCalculations]; List <string> arrayMe = new List <string>(); List <string> arrayMo = new List <string> (); int[,] lilMKeyBlocksMatrix = new int[8, 1]; List <string> subkeys = new List <string>(); for (int i = 0; i < forCalculations; i++) { for (int k = 0; k < 8; k++) { lilMKeyBlocksMatrix[k, 0] = Convert.ToInt32(lilMKeyBlocksBin[i * 8 + k], 2); } var promezhutoch = MyMath.MatrixMultiplication(M2Matrix, lilMKeyBlocksMatrix); int vItoe = 0; for (int j = 0; j < 4; j++) { vItoe += (int)(promezhutoch[j, 0]); } arrayV[forCalculations - i - 1] = vItoe;//можно объединить с фором выше arrayMe.Add(bigMKeyBlocks[2 * i]); arrayMo.Add(bigMKeyBlocks[2 * i + 1]); } for (int i = 0; i < 40; i++) { var AItoe = HFunction(StringMethods.MyConvertToString((int)(2 * i * p), 2, 32), arrayMe, forCalculations); var BItoe = StringMethods.MyConvertToString(HFunction(StringMethods.MyConvertToString((int)((2 * i + 1) * p), 2, 32), arrayMo, forCalculations), 2, 32); for (int j = 0; j < 8; j++) { BItoe = MyMath.LeftCycleShift(BItoe); } if ((i % 2) == 0) { var subkeyI = StringMethods.MyConvertToString((int)(AItoe + Convert.ToInt32(BItoe, 2) % Math.Pow(2, 32)), 2, 32); subkeys.Add(subkeyI); } else { var subkeyI = StringMethods.MyConvertToString((int)(AItoe + Convert.ToInt32(BItoe, 2) * 2 % Math.Pow(2, 32)), 2, 32); for (int j = 0; j < 9; j++) { subkeyI = MyMath.LeftCycleShift(subkeyI); } subkeys.Add(subkeyI); } } return(subkeys); }
public static int HFunction(string word32BitDuoSS, List <string> arrayForCalculations, int kNumber) { int[,] matrixStep5 = new int[1, 4]; //int[,] resultArrayStep5 = new int[1, 4]; while (word32BitDuoSS.Length != 32) { word32BitDuoSS = word32BitDuoSS.Insert(0, "0"); } string stepResult = word32BitDuoSS; int stepNum = 2; if (kNumber >= 2) { if (kNumber > 2) { stepNum -= 1; if (kNumber > 3) { stepNum -= 1; } } } for (int i = stepNum; i < 5; i++) { string block32BitAfterQ = ""; var subWords8Bit = StringMethods.StringToList(stepResult, byteLength); int flag = 0; foreach (string subWord in subWords8Bit) { int y = 0; var a0 = Convert.ToInt32(subWord, 2) / 16; var b0 = Convert.ToInt32(subWord, 2) % 16; var a1 = a0 ^ b0; var test = StringMethods.MyConvertToString(b0, 2, 8); var b0Nibbles = StringMethods.StringToList(StringMethods.MyConvertToString(b0, 2, 8), NibbleLength); foreach (string nibble in b0Nibbles) { MyMath.RightCycleShift(nibble); } var b1 = (a0 ^ Convert.ToInt32(StringMethods.ListToString(b0Nibbles), 2) ^ (8 * a0)) % 16; if (qOperationMatrix[stepNum, flag] == 0) { var a2 = Convert.ToInt32(tItoeForQ0[0, a1], 16); var b2 = Convert.ToInt32(tItoeForQ0[1, b1], 16); var a3 = a2 ^ b2; var b2Nibbles = StringMethods.StringToList(StringMethods.MyConvertToString(b2, 2, 8), NibbleLength); foreach (string nibble in b2Nibbles) { MyMath.RightCycleShift(nibble); } var b3 = (a2 ^ Convert.ToInt32(StringMethods.ListToString(b2Nibbles), 2) ^ (8 * a2)) % 16; var a4 = Convert.ToInt32(tItoeForQ0[2, a3], 16); var b4 = Convert.ToInt32(tItoeForQ0[3, b3], 16); y = 16 * a4 + b4; } else { var a2 = Convert.ToInt32(tItoeForQ1[0, a1], 16); var b2 = Convert.ToInt32(tItoeForQ1[1, b1], 16); var a3 = a2 ^ b2; var b2Nibbles = StringMethods.StringToList(StringMethods.MyConvertToString(b2, 2, 8), NibbleLength); foreach (string nibble in b2Nibbles) { MyMath.RightCycleShift(nibble); } var b3 = (a2 ^ Convert.ToInt32(StringMethods.ListToString(b2Nibbles), 2) ^ (8 * a2)) % 16; var a4 = Convert.ToInt32(tItoeForQ1[2, a3], 16); var b4 = Convert.ToInt32(tItoeForQ1[3, b3], 16); y = 16 * a4 + b4; } block32BitAfterQ += StringMethods.MyConvertToString(y, 2, 8); flag++; } if (i != 4) { stepResult = StringMethods.MyConvertToString(Convert.ToInt32(block32BitAfterQ, 2) ^ Convert.ToInt32(arrayForCalculations[3 - i], 2), 2, 32); } else { var arrayAfterQ = StringMethods.StringToList(block32BitAfterQ, 8); for (int k = 0; k < 4; k++) { matrixStep5[0, k] = Convert.ToInt32(arrayAfterQ[k], 2); } //resultArrayStep5 = MyMath.MatrixMultiplication(M1Matrix, matrixStep5); } } int hResult = 0; for (int j = 0; j < 3; j++) { hResult += (int)(matrixStep5[0, j]); } return(hResult); }