예제 #1
0
        /// <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);
        }
예제 #2
0
        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);
        }