Exemplo n.º 1
0
        public static char[,] RiL(char[] blokR, char[] blokL, char[,] tablicaPermutacjiKlucza2, int numer)
        {
            char[,] rl = new char[2, 32];
            char[] blokR8 = Des.Permutacja(blokR, Des.E);

            char[] tablicaK = new char[48];
            for (int i = 0; i < 48; i++)
            {
                tablicaK[i] = tablicaPermutacjiKlucza2[numer, i];
            }

            char[] tablicaXOR = Des.Xorowanie(tablicaK, blokR8);
            Console.WriteLine("-----------------------------------------------");
            Console.Write("BLOK R: ");
            foreach (char element in blokR)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write("BLOK L: ");
            foreach (char element in blokL)
            {
                Console.Write(element);
            }
            Console.Write("\n");

            int p = 0;

            char[,] S = new char[8, 6];
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    S[i, j] = tablicaXOR[p]; p++;
                }
            }
            Console.Write("KLUCZ: ");
            foreach (char element in tablicaK)
            {
                Console.Write(element);
            }
            Console.Write("\nBLOK R: ");
            foreach (char element in blokR8)
            {
                Console.Write(element);
            }
            Console.Write("\nXOROWANIE: ");
            foreach (char element in tablicaXOR)
            {
                Console.Write(element);
            }
            Console.Write("\n");

            char[] ciag6bit1 = Des.Odczytywanie(0, S, Des.S1);
            char[] ciag6bit2 = Des.Odczytywanie(1, S, Des.S2);
            char[] ciag6bit3 = Des.Odczytywanie(2, S, Des.S3);
            char[] ciag6bit4 = Des.Odczytywanie(3, S, Des.S4);
            char[] ciag6bit5 = Des.Odczytywanie(4, S, Des.S5);
            char[] ciag6bit6 = Des.Odczytywanie(5, S, Des.S6);
            char[] ciag6bit7 = Des.Odczytywanie(6, S, Des.S7);
            char[] ciag6bit8 = Des.Odczytywanie(7, S, Des.S8);

            Console.Write(" CIĄG 1: ");
            foreach (char element in ciag6bit1)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write(" CIĄG 2: ");
            foreach (char element in ciag6bit2)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write(" CIĄG 3: ");
            foreach (char element in ciag6bit3)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write(" CIĄG 4: ");
            foreach (char element in ciag6bit4)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write(" CIĄG 5: ");
            foreach (char element in ciag6bit5)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write(" CIĄG 6: ");
            foreach (char element in ciag6bit6)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write(" CIĄG 7: ");
            foreach (char element in ciag6bit7)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write(" CIĄG 8: ");
            foreach (char element in ciag6bit8)
            {
                Console.Write(element);
            }
            Console.Write("\n");


            char[] ciagR = new char[32];
            int    r     = 0;

            foreach (char i in ciag6bit1)
            {
                ciagR[r++] = i;
            }
            foreach (char i in ciag6bit2)
            {
                ciagR[r++] = i;
            }
            foreach (char i in ciag6bit3)
            {
                ciagR[r++] = i;
            }
            foreach (char i in ciag6bit4)
            {
                ciagR[r++] = i;
            }
            foreach (char i in ciag6bit5)
            {
                ciagR[r++] = i;
            }
            foreach (char i in ciag6bit6)
            {
                ciagR[r++] = i;
            }
            foreach (char i in ciag6bit7)
            {
                ciagR[r++] = i;
            }
            foreach (char i in ciag6bit8)
            {
                ciagR[r++] = i;
            }

            char[] RPermutacja = Des.Permutacja(ciagR, Des.P);

            char[] blokRn = Des.Xorowanie(RPermutacja, blokL);
            char[] blokLn = blokR;

            Console.Write("NOWE R: ");
            foreach (char element in ciagR)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write("R PO PERMUTACJI: ");
            foreach (char element in RPermutacja)
            {
                Console.Write(element);
            }
            Console.Write("\n");
            Console.Write("XOROWANIE: ");
            foreach (char element in blokRn)
            {
                Console.Write(element);
            }
            Console.Write("\n");

            for (int i = 0; i < 32; i++)
            {
                rl[0, i] = blokRn[i];
                rl[1, i] = blokLn[i];
            }
            Console.WriteLine("-----------------------------------------------");
            return(rl);
        }
        static void Main(string[] args)
        {
            int wybor;

            Console.WriteLine("halo!");
            while (true)
            {
                Console.WriteLine("--------------------------------------------------");
                Console.WriteLine("--------------------------------------------------");
                Console.WriteLine("--------------------------------------------------");
                Console.WriteLine("Menu\n 1-KODOWANIE\n 2-ODKODOWANIE");
                Console.WriteLine("--------------------------------------------------");
                Console.WriteLine("--------------------------------------------------");
                Console.WriteLine("--------------------------------------------------");

                string s = Console.ReadLine();

                int.TryParse(s, out wybor);

                if (wybor == null)
                {
                    continue;
                }

                switch (wybor)
                {
                case 1:
                {
                    Console.WriteLine("KODOWANIE");
                    string ostatnie1 = "";
                    string plikb, plikk;

                    do
                    {
                        Console.Write("Plik tekstu: ");
                        plikb = Console.ReadLine();
                    } while (!File.Exists(plikb));
                    string tekstJawny = FileHandler.ReadFromTextFile2(plikb);

                    do
                    {
                        Console.Write("plik klucza: ");
                        plikk = Console.ReadLine();
                    } while (!File.Exists(plikk));

                    string klucz = FileHandler.ReadFromTextFile1(plikk);

                    while (klucz.Length < 64)
                    {
                        klucz = "0" + klucz;
                    }

                    char[] tablicaPoczatkowa      = new char[64];
                    char[] tablicaPoczatkowaKlucz = new char[64];

                    int m = 0;
                    for (int a = 0; a < (tekstJawny.Length / 64); a++)
                    {
                        for (int i = 0; i < 64; i++)
                        {
                            tablicaPoczatkowa[i]      = tekstJawny[m++];
                            tablicaPoczatkowaKlucz[i] = klucz[i];
                        }

                        char[] tablicaPermutacji = Des.Permutacja(tablicaPoczatkowa, Des.ip);
                        char[] blokL             = Des.Dzielenie(tablicaPermutacji, 32, 0);
                        char[] blokP             = Des.Dzielenie(tablicaPermutacji, 32, 32);

                        char[] tablicaPermutacjiKlucza = Des.Permutacja(tablicaPoczatkowaKlucz, Des.pc);
                        char[] kluczC = Des.Dzielenie(tablicaPermutacjiKlucza, 28, 0);
                        char[] kluczD = Des.Dzielenie(tablicaPermutacjiKlucza, 28, 28);

                        Console.Write("KLUCZ (BIN): ");
                        foreach (char element in tablicaPoczatkowaKlucz)
                        {
                            Console.Write(element);
                        }

                        Console.Write("\nKLUCZ C: ");
                        foreach (char element in kluczC)
                        {
                            Console.Write(element);
                        }

                        Console.Write("\nKLUCZ D: ");
                        foreach (char element in kluczD)
                        {
                            Console.Write(element);
                        }
                        Console.Write("\n");
                        Console.WriteLine("-----------------------------------------------");

                        List <char> kluczC6 = new List <char>(kluczC);
                        List <char> kluczD6 = new List <char>(kluczD);
                        char[,] kluczeCpo6 = new char[16, 28];
                        char[,] kluczeDpo6 = new char[16, 28];
                        for (int i = 0; i < 16; i++)
                        {
                            kluczC6.AddRange(kluczC6.GetRange(0, Des.przesuniecie6[i]));
                            kluczC6.RemoveRange(0, Des.przesuniecie6[i]);

                            kluczD6.AddRange(kluczD6.GetRange(0, Des.przesuniecie6[i]));
                            kluczD6.RemoveRange(0, Des.przesuniecie6[i]);

                            for (int j = 0; j < 28; j++)
                            {
                                kluczeCpo6[i, j] = kluczC6[j];
                                kluczeDpo6[i, j] = kluczD6[j];
                            }
                        }
                        for (int u = 0; u < 16; u++)
                        {
                            Console.Write("KLUCZ C {0}: ", u + 1);
                            for (int i = 0; i < 28; i++)
                            {
                                Console.Write(kluczeCpo6[u, i]);
                            }
                            Console.Write("KLUCZ D {0}: ", u + 1);
                            for (int i = 0; i < 28; i++)
                            {
                                Console.Write(kluczeDpo6[u, i]);
                            }
                            Console.Write("\n");
                        }
                        Console.WriteLine("-----------------------------------------------");

                        char[,] K = new char[16, 56];
                        for (int i = 0; i < 16; i++)
                        {
                            for (int j = 0; j < 28; j++)
                            {
                                K[i, j] = kluczeCpo6[i, j];
                            }
                            for (int j = 28, k = 0; j < 56; j++, k++)
                            {
                                K[i, j] = kluczeDpo6[i, k];
                            }
                        }

                        int pomocnicza = 0;
                        char[,] tablicaPermutacjiKlucza2 = new char[16, 48];
                        for (int i = 0; i < 16; i++)
                        {
                            for (int j = 0; j < 48; j++)
                            {
                                pomocnicza = Des.pc2[j];
                                tablicaPermutacjiKlucza2[i, j] = K[i, pomocnicza - 1];
                            }
                        }
                        for (int u = 0; u < 16; u++)
                        {
                            Console.Write("KLUCZ WYJSCIOWE " + "{0}: ", u + 1);
                            for (int i = 0; i < 48; i++)
                            {
                                Console.Write(tablicaPermutacjiKlucza2[u, i]);
                            }
                            Console.Write("\n");
                        }
                        Console.WriteLine("-----------------------------------------------");
                        Console.Write("TEKST POCZATKOWY: ");
                        Console.WriteLine(tablicaPoczatkowa);

                        char[,] ril0  = Des.RiL(blokP, blokL, tablicaPermutacjiKlucza2, 0);
                        char[,] ril1  = Des.Laczenie(ril0, tablicaPermutacjiKlucza2, 1);
                        char[,] ril2  = Des.Laczenie(ril1, tablicaPermutacjiKlucza2, 2);
                        char[,] ril3  = Des.Laczenie(ril2, tablicaPermutacjiKlucza2, 3);
                        char[,] ril4  = Des.Laczenie(ril3, tablicaPermutacjiKlucza2, 4);
                        char[,] ril5  = Des.Laczenie(ril4, tablicaPermutacjiKlucza2, 5);
                        char[,] ril6  = Des.Laczenie(ril5, tablicaPermutacjiKlucza2, 6);
                        char[,] ril7  = Des.Laczenie(ril6, tablicaPermutacjiKlucza2, 7);
                        char[,] ril8  = Des.Laczenie(ril7, tablicaPermutacjiKlucza2, 8);
                        char[,] ril9  = Des.Laczenie(ril8, tablicaPermutacjiKlucza2, 9);
                        char[,] ril10 = Des.Laczenie(ril9, tablicaPermutacjiKlucza2, 10);
                        char[,] ril11 = Des.Laczenie(ril10, tablicaPermutacjiKlucza2, 11);
                        char[,] ril12 = Des.Laczenie(ril11, tablicaPermutacjiKlucza2, 12);
                        char[,] ril13 = Des.Laczenie(ril12, tablicaPermutacjiKlucza2, 13);
                        char[,] ril14 = Des.Laczenie(ril13, tablicaPermutacjiKlucza2, 14);
                        char[,] ril15 = Des.Laczenie(ril14, tablicaPermutacjiKlucza2, 15);

                        char[] koniec = new char[64];
                        for (int i = 0; i < 32; i++)
                        {
                            koniec[i] = ril15[0, i];
                        }
                        int d = 32;
                        for (int i = 0; i < 32; i++)
                        {
                            koniec[d++] = ril15[1, i];
                        }

                        char[] koniecPer = Des.Permutacja(koniec, Des.IP1minus1);

                        string str = new string(koniecPer);
                        ostatnie1 += str;
                        Console.Write("TEKST WYJSCIOWY {0} (BIN): " + str, a + 1);
                        string wyjscie = FileHandler.BinaryToString(str);
                        Console.WriteLine("\nTEKST WYJSCIOWY: " + wyjscie);
                        File.AppendAllText(@"z.txt", wyjscie);
                        string wyjscie1 = FileHandler.BinaryStringToHexString(str);
                        Console.WriteLine("\nTEKST WYJSCIOWY: " + wyjscie1);
                        File.AppendAllText(@"z1.txt", wyjscie1);
                    }
                    Console.WriteLine("--------------------------------");
                    Console.WriteLine("TEKST ZAKODOWANY: " + ostatnie1);
                    string wyjscie2 = FileHandler.BinaryStringToHexString(ostatnie1);
                    Console.WriteLine("\nTEKST WYJSCIOWY: " + wyjscie2);
                    break;
                }

                case 2:
                {
                    string tekstZakodowany = "";
                    Console.WriteLine("DEKODOWANIE");

                    string plikb, plikk;
                    do
                    {
                        Console.Write("Plik szyfru: ");
                        plikb = Console.ReadLine();
                    } while (!File.Exists(plikb));

                    tekstZakodowany = FileHandler.ReadFromTextFile(plikb);         //zm
                    do
                    {
                        Console.Write("Plik klucza: ");
                        plikk = Console.ReadLine();
                    } while (!File.Exists(plikk));

                    string klucz = FileHandler.ReadFromTextFile1(plikk);
                    while (klucz.Length < 64)
                    {
                        klucz = "0" + klucz;
                    }
                    char[] tablicaPoczatkowa      = new char[64];
                    char[] tablicaPoczatkowaKlucz = new char[64];
                    string ostatnie = "";
                    int    m        = 0;
                    for (int a = 0; a < tekstZakodowany.Length / 64; a++)
                    {
                        for (int i = 0; i < 64; i++)
                        {
                            tablicaPoczatkowa[i]      = tekstZakodowany[m];
                            tablicaPoczatkowaKlucz[i] = klucz[i];
                            m++;
                        }

                        char[] tablicaPermutacji = Des.Permutacja(tablicaPoczatkowa, Des.ip);            //2.
                        char[] blokL             = Des.Dzielenie(tablicaPermutacji, 32, 0);              //3.
                        char[] blokP             = Des.Dzielenie(tablicaPermutacji, 32, 32);             //3.

                        char[] tablicaPermutacjiKlucza = Des.Permutacja(tablicaPoczatkowaKlucz, Des.pc); //4.
                        char[] kluczC = Des.Dzielenie(tablicaPermutacjiKlucza, 28, 0);                   //5.
                        char[] kluczD = Des.Dzielenie(tablicaPermutacjiKlucza, 28, 28);                  //5.
                        Console.WriteLine("-----------------------------------------------");
                        Console.Write("KLUCZ (BIN): ");
                        foreach (char element in tablicaPoczatkowaKlucz)
                        {
                            Console.Write(element);
                        }
                        Console.Write("\n");
                        Console.Write("KLUCZ C: ");
                        foreach (char element in kluczC)
                        {
                            Console.Write(element);
                        }
                        Console.Write("\n");
                        Console.Write("KLUCZ D: ");
                        foreach (char element in kluczD)
                        {
                            Console.Write(element);
                        }
                        Console.Write("\n");
                        Console.WriteLine("-----------------------------------------------");

                        List <char> kluczC6 = new List <char>(kluczC);
                        List <char> kluczD6 = new List <char>(kluczD);
                        char[,] kluczeCpo6 = new char[16, 28];
                        char[,] kluczeDpo6 = new char[16, 28];
                        for (int i = 0; i < 16; i++)
                        {
                            kluczC6.AddRange(kluczC6.GetRange(0, Des.przesuniecie6[i]));
                            kluczC6.RemoveRange(0, Des.przesuniecie6[i]);

                            kluczD6.AddRange(kluczD6.GetRange(0, Des.przesuniecie6[i]));
                            kluczD6.RemoveRange(0, Des.przesuniecie6[i]);

                            for (int j = 0; j < 28; j++)
                            {
                                kluczeCpo6[i, j] = kluczC6[j];
                                kluczeDpo6[i, j] = kluczD6[j];
                            }
                        }
                        for (int u = 0; u < 16; u++)
                        {
                            Console.Write("KLUCZ C {0}: ", u + 1);
                            for (int i = 0; i < 28; i++)
                            {
                                Console.Write(kluczeCpo6[u, i]);
                            }
                            Console.Write("KLUCZ D {0}: ", u + 1);
                            for (int i = 0; i < 28; i++)
                            {
                                Console.Write(kluczeDpo6[u, i]);
                            }
                            Console.Write("\n");
                        }
                        Console.WriteLine("-----------------------------------------------");

                        char[,] K = new char[16, 56];
                        for (int i = 0; i < 16; i++)
                        {
                            for (int j = 0; j < 28; j++)
                            {
                                K[i, j] = kluczeCpo6[i, j];
                            }
                            for (int j = 28, k = 0; j < 56; j++, k++)
                            {
                                K[i, j] = kluczeDpo6[i, k];
                            }
                        }

                        int pomocnicza = 0;
                        char[,] tablicaPermutacjiKlucza2 = new char[16, 48];
                        for (int i = 0; i < 16; i++)
                        {
                            for (int j = 0; j < 48; j++)
                            {
                                pomocnicza = Des.pc2[j];
                                tablicaPermutacjiKlucza2[i, j] = K[i, pomocnicza - 1];
                            }
                        }
                        for (int u = 0; u < 16; u++)
                        {
                            Console.Write("KLUCZ WYJSCIOWE " + "{0}: ", u + 1);
                            for (int i = 0; i < 48; i++)
                            {
                                Console.Write(tablicaPermutacjiKlucza2[u, i]);
                            }
                            Console.Write("\n");
                        }
                        Console.WriteLine("-----------------------------------------------");
                        Console.Write("TEKST POCZATKOWY: ");
                        Console.Write(tablicaPoczatkowa);

                        char[,] ril0  = Des.RiL(blokP, blokL, tablicaPermutacjiKlucza2, 15);
                        char[,] ril1  = Des.Laczenie(ril0, tablicaPermutacjiKlucza2, 14);
                        char[,] ril2  = Des.Laczenie(ril1, tablicaPermutacjiKlucza2, 13);
                        char[,] ril3  = Des.Laczenie(ril2, tablicaPermutacjiKlucza2, 12);
                        char[,] ril4  = Des.Laczenie(ril3, tablicaPermutacjiKlucza2, 11);
                        char[,] ril5  = Des.Laczenie(ril4, tablicaPermutacjiKlucza2, 10);
                        char[,] ril6  = Des.Laczenie(ril5, tablicaPermutacjiKlucza2, 9);
                        char[,] ril7  = Des.Laczenie(ril6, tablicaPermutacjiKlucza2, 8);
                        char[,] ril8  = Des.Laczenie(ril7, tablicaPermutacjiKlucza2, 7);
                        char[,] ril9  = Des.Laczenie(ril8, tablicaPermutacjiKlucza2, 6);
                        char[,] ril10 = Des.Laczenie(ril9, tablicaPermutacjiKlucza2, 5);
                        char[,] ril11 = Des.Laczenie(ril10, tablicaPermutacjiKlucza2, 4);
                        char[,] ril12 = Des.Laczenie(ril11, tablicaPermutacjiKlucza2, 3);
                        char[,] ril13 = Des.Laczenie(ril12, tablicaPermutacjiKlucza2, 2);
                        char[,] ril14 = Des.Laczenie(ril13, tablicaPermutacjiKlucza2, 1);
                        char[,] ril15 = Des.Laczenie(ril14, tablicaPermutacjiKlucza2, 0);

                        char[] koniec = new char[64];
                        for (int i = 0; i < 32; i++)
                        {
                            koniec[i] = ril15[0, i];
                        }
                        int d = 32;
                        for (int i = 0; i < 32; i++)
                        {
                            koniec[d++] = ril15[1, i];
                        }

                        char[] koniecPer = Des.Permutacja(koniec, Des.IP1minus1);         //18.

                        string str1 = new string(koniecPer);
                        ostatnie += str1;

                        Console.Write("TEKST WYJSCIOWY {0} (BIN): " + str1, a + 1);

                        string wyjscie1 = FileHandler.BinaryToString(str1);

                        Console.WriteLine("\n--------------------------------");
                        File.AppendAllText(@"d.txt", wyjscie1);
                    }
                    Console.WriteLine("--------------------------------");
                    Console.WriteLine("KOD:           " + ostatnie);
                    string liczba = ostatnie.Substring(ostatnie.Length - 8, 8);
                    int    licz   = int.Parse(FileHandler.BinaryToString(liczba));
                    ostatnie = ostatnie.Remove(ostatnie.Length - (licz * 8));
                    string wyjscie = FileHandler.BinaryToString(ostatnie);
                    Console.WriteLine("KOD WYJSCIOWY: " + ostatnie);
                    Console.WriteLine("TEKST:" + wyjscie);

                    File.WriteAllText(@"d1.txt", wyjscie);
                    break;
                }

                default:
                {
                    break;
                }
                }
            }
        }