/// <summary> /// 48 bitlik datayı 32 bit'e dönüştürür. /// </summary> /// <param name="input"></param> /// <returns></returns> public static string SBoxSubstitution(string input) { //48 biti 6 bitlik bloklara bölüyoruz List <string> sixBitBlocks = new List <string>(); for (int inputIndex = 0; inputIndex < input.Length; inputIndex += 6) { if (inputIndex + 6 < input.Length) { sixBitBlocks.Add(input.Substring(inputIndex, 6)); } else { sixBitBlocks.Add(input.Substring(inputIndex)); break; } } string result = ""; /* * Her bir blok için ilk ve son bit yan yana eklenip * integer'a çevirilecek. elde edilen sayı satırı belirtecek. * * Ortada kalanlar ise yine ineteger'a çevirilecek. elde edilen * sayı sütunu belirtecek. */ for (int blockIndex = 0; blockIndex < sixBitBlocks.Count; blockIndex++) { //block tablosu index'e göre alınıyor int[,] sBoxTable = Data.SBoxSubstitutionTables[blockIndex]; var block = sixBitBlocks[blockIndex]; //satır numarası alınıyor string lineNumberBinary = ""; //baştaki rakam direkt alınıp block'tan kaldırılıyor lineNumberBinary += block[0]; block = block.Remove(0, 1); //ikinci rakam eğer var ise alınıp block'tan kaldırılıyor if (block.Length > 0) { lineNumberBinary += block[block.Length - 1]; block = block.Remove(block.Length - 1, 1); } //satır sayısı alındı int lineNumber = BinaryHelper.BinaryToInteger(lineNumberBinary); //sütun numarası alınıyor int columnNumber = 0; if (block.Length > 0) { columnNumber = BinaryHelper.BinaryToInteger(block); } int intValue = sBoxTable[lineNumber, columnNumber]; result += BinaryHelper.IntegerToBinary(intValue, 4); } return(result); }
public static string Crypt(string binaryData, string hexKey, EnumProcessType processType) { //hexKey bit string'e dönüşütürülür string bitKey = BinaryHelper.GetBitsFromHex(hexKey); //Key 64 bit'ten 56 bit'e dönüştürülür bitKey = CompressionPermutationKeyInit(bitKey); string result = ""; List <int> roundIndexes = new List <int>(); for (int index = 0; index < ((decimal)binaryData.Length / (decimal)64); index++) { roundIndexes.Add(index); } //On decrpytion, rounds are reversed if (processType == EnumProcessType.DECRYPTION) { roundIndexes.Reverse(); } foreach (int index in roundIndexes) { bool finished = false; string currentBinaryString = binaryData.Substring(index * 64); if (currentBinaryString.Length > 64) { currentBinaryString = currentBinaryString.Substring(0, 64); finished = processType == EnumProcessType.DECRYPTION && index == 0; } else { finished = processType == EnumProcessType.ENCRYPTION || (processType == EnumProcessType.DECRYPTION && index == 0); } currentBinaryString = InitialPermutation(currentBinaryString); //32'şer bit olarak data ikiye ayrılır string leftBinaryString = currentBinaryString.Substring(0, currentBinaryString.Length / 2); string rightBinaryString = currentBinaryString.Substring(currentBinaryString.Length / 2); var cryptIndexes = new List <int>(); for (int cryptIndex = 0; cryptIndex < 16; cryptIndex++) { cryptIndexes.Add(cryptIndex); } if (processType == EnumProcessType.DECRYPTION) { cryptIndexes.Reverse(); } //cryp işlemleri 16 kez tekrarlanır. Her adımda data çaprazlanır foreach (int cryptIndex in cryptIndexes) { //Bu adım için 56 bitlik Key'den 48 bitlik yeni key üretilir var transformedKey = KeyTransformation(bitKey, cryptIndex, processType); //FUNCTION çalıştırılır var expandedRightBinaryString = MainFunction(rightBinaryString, transformedKey); //leftBinaryString (48bit) ve expandedRightBinaryString (48bit) XOR'lanır (her bit ikilik sistemde toplanıp mod2'si alınır) leftBinaryString = XORArray(leftBinaryString, expandedRightBinaryString); //left ve right'ın yerleri değiştirilerek yeni adıma hazırlanır. (çaprazlama) string prevLeftBinaryString = leftBinaryString; leftBinaryString = rightBinaryString; rightBinaryString = prevLeftBinaryString; } //sonuçta elde edilen left ve right birbirine eklenerek 64 bitlik data elde edilir var resultBinary = leftBinaryString + rightBinaryString; resultBinary = FinalPermutation(resultBinary); result += resultBinary; if (finished) { break; } } return(result); }