Untitled

 avatar
unknown
csharp
3 years ago
12 kB
3
Indexable
using System;
using System.IO;
using System.Text;

namespace Szyfrowanie_RC4
{
    class Program
    {
        /* W programie uzyto zmiennej typu byte - jest ona ekwiwalentem unsigned char z jezyka C.
         * Metoda Encoding.ASCII.GetBytes(arg) pobiera argument typu string i zwraca tablice byte
         * zakodowana w ASCII.
         * */

        static void Main(string[] args)
        {

            /*PARAMETRY*/
            String inputFile = "./../../../input.txt";
            String outputFile = "./../../../output.txt";
            String decryptedFile = "./../../../decryptedText.txt";
            String sourceKey = "JanP2";


            try
            {
                byte[] input = GrabInput(inputFile);                //Szyfracja
                GenerateOutput(Encrypt(sourceKey, input), outputFile);

                byte[] output = GrabOutput(outputFile);             //Deszyfracja
                Decrypt(sourceKey, output, decryptedFile);
            }
            catch(Exception ex)
            {
                Console.WriteLine("Error occurred: {0}", ex.Message);
            }
        }

    /*-------------------------------------------------------------------------
     * Metody inicjacji klucza
     * */



        /*Zwraca zainicjowany klucz*/
        private static byte[] InitiateKey(String sourceKey)
        {
            var S = GenerateArray();
            var key = GenerateKey(sourceKey);

            for(int i = 0, j = 0; i < 256; i++)
            {
                j = (j + S[i] + key[i % sourceKey.Length]) % 256;
                Swap(S, i, j);
            }
            return S;
        }



        /* Pobiera klucz. Jezeli dlugosc klucza jest wieksza niz klucz, wyrzuca wyjatek
         * ze stosownym komunikatem. Jezeli jest odwrotnie, bierze pierwsze X znakow klucza,
         * gdzie X to dlugosc klucza.
         */
        private static byte[] GenerateKey(String sourceKey)
        {
            try
            {
                if(sourceKey.Length > 16 || sourceKey.Length < 5)
                {
                    throw new Exception();
                }
                return Encoding.ASCII.GetBytes(sourceKey.Substring(0, sourceKey.Length));
            }
            catch(Exception ex)
            {
                throw new Exception($"Wrong key length: {sourceKey.Length}. Please choose a key containing more than 4 and less than 17 characters.");            
            }
        }



        /* Tworzy permutacje identycznosciowa*/
        private static byte[] GenerateArray()
        {
            byte[] S = new byte[256];
            for(int i = 0; i < 256; i++)
            {
                S[i] = (byte) i;
            }
            return S;
        }


    /*--------------------------------------------------------------------------
     * Metody szyfrujace
     * */



        private static byte[] Encrypt(String sourceKey, byte[] input)
        {
            byte[] S = InitiateKey(sourceKey);
            byte[] output = new byte[input.Length];
            for(int k = 0, i = 0, j = 0; k < input.Length; k++)
            {
                i = (i + 1) % 256;
                j = (j + S[i]) % 256;
                Swap(S, i, j);
                byte keystreamByte = S[(S[i] + S[j]) % 256];
                output[k] = (byte)(keystreamByte ^ input[k]);       //Wymaga rzutowania, bo XOR zwraca wartość jako int.
            }
            return output;
        }


        /* Zamienia miejscami elementy pod danymi indeksami tablicy*/
        private static void Swap(byte[] S, int i, int j)
        {
            byte x = S[i];
            S[i] = S[j];
            S[j] = x;
        }


        private static void Decrypt(String sourceKey, byte[] encryptedText, String decryptedFile)
        {
            byte[] decryptedText = Encrypt(sourceKey, encryptedText);
            File.WriteAllText(decryptedFile, Encoding.ASCII.GetString(decryptedText));
        }

    /*------------------------------------------------------------------------------------
     * Metody obslugujace pliki
     * */



        /* Zwraca teskt jawny przekonwertowany do tablicy bajtow*/
        private static byte[] GrabInput(String inputFile)
        {
            try
            {
                return Encoding.ASCII.GetBytes(File.ReadAllText(inputFile));
            }

            catch(FileNotFoundException ex)
            {
                throw new FileNotFoundException("File not found");
            }
            catch(FileLoadException ex)
            {
                throw new FileLoadException("Could not open the file");
            }
        }



        /* Konwertuje wygenerowany tekst zaszyfrowany do tablicy bajtow i zwraca ja. */
        private static byte[] GrabOutput(String outputFile)
        {
            try
            {
                String output = File.ReadAllText(outputFile);
                byte[] byteArray = new byte[output.Length];
                for(int i = 0; i < output.Length; i++)
                {
                    byteArray[i] = (byte)Convert.ToInt32(output[i]);
                }
                return byteArray;
            }

            catch(FileNotFoundException ex)
            {
                throw new FileNotFoundException("File not found");
            }
            catch(FileLoadException ex)
            {
                throw new FileLoadException("Could not open the file");
            }
        }


        /* Zapisuje dana tablice bajtow do podanego pliku. Ze wzgledu
         * Niemodyfikowalnosc stringow w C# konieczne jest uzycie
         * StringBuildera.
         */
        private static void GenerateOutput(byte[] output, String outputFile)
        {
            StringBuilder stringBuilder = new StringBuilder();
            foreach(byte encryptedByte in output)
            {
                stringBuilder.Append(Convert.ToChar(encryptedByte));
            }
            File.WriteAllText(outputFile, stringBuilder.ToString());
        }

    }
}
using System;
using System.IO;
using System.Text;

namespace Szyfrowanie_RC4
{
    class Program
    {
        /* W programie uzyto zmiennej typu byte - jest ona ekwiwalentem unsigned char z jezyka C.
         * Metoda Encoding.ASCII.GetBytes(arg) pobiera argument typu string i zwraca tablice byte
         * zakodowana w ASCII.
         * */

        static void Main(string[] args)
        {

            /*PARAMETRY*/
            String inputFile = "./../../../input.txt";
            String outputFile = "./../../../output.txt";
            String decryptedFile = "./../../../decryptedText.txt";
            String sourceKey = "JanP2";


            try
            {
                byte[] input = GrabInput(inputFile);                //Szyfracja
                GenerateOutput(Encrypt(sourceKey, input), outputFile);

                byte[] output = GrabOutput(outputFile);             //Deszyfracja
                Decrypt(sourceKey, output, decryptedFile);
            }
            catch(Exception ex)
            {
                Console.WriteLine("Error occurred: {0}", ex.Message);
            }
        }

    /*-------------------------------------------------------------------------
     * Metody inicjacji klucza
     * */



        /*Zwraca zainicjowany klucz*/
        private static byte[] InitiateKey(String sourceKey)
        {
            var S = GenerateArray();
            var key = GenerateKey(sourceKey);

            for(int i = 0, j = 0; i < 256; i++)
            {
                j = (j + S[i] + key[i % sourceKey.Length]) % 256;
                Swap(S, i, j);
            }
            return S;
        }



        /* Pobiera klucz. Jezeli dlugosc klucza jest wieksza niz klucz, wyrzuca wyjatek
         * ze stosownym komunikatem. Jezeli jest odwrotnie, bierze pierwsze X znakow klucza,
         * gdzie X to dlugosc klucza.
         */
        private static byte[] GenerateKey(String sourceKey)
        {
            try
            {
                if(sourceKey.Length > 16 || sourceKey.Length < 5)
                {
                    throw new Exception();
                }
                return Encoding.ASCII.GetBytes(sourceKey.Substring(0, sourceKey.Length));
            }
            catch(Exception ex)
            {
                throw new Exception($"Wrong key length: {sourceKey.Length}. Please choose a key containing more than 4 and less than 17 characters.");            
            }
        }



        /* Tworzy permutacje identycznosciowa*/
        private static byte[] GenerateArray()
        {
            byte[] S = new byte[256];
            for(int i = 0; i < 256; i++)
            {
                S[i] = (byte) i;
            }
            return S;
        }


    /*--------------------------------------------------------------------------
     * Metody szyfrujace
     * */



        private static byte[] Encrypt(String sourceKey, byte[] input)
        {
            byte[] S = InitiateKey(sourceKey);
            byte[] output = new byte[input.Length];
            for(int k = 0, i = 0, j = 0; k < input.Length; k++)
            {
                i = (i + 1) % 256;
                j = (j + S[i]) % 256;
                Swap(S, i, j);
                byte keystreamByte = S[(S[i] + S[j]) % 256];
                output[k] = (byte)(keystreamByte ^ input[k]);       //Wymaga rzutowania, bo XOR zwraca wartość jako int.
            }
            return output;
        }


        /* Zamienia miejscami elementy pod danymi indeksami tablicy*/
        private static void Swap(byte[] S, int i, int j)
        {
            byte x = S[i];
            S[i] = S[j];
            S[j] = x;
        }


        private static void Decrypt(String sourceKey, byte[] encryptedText, String decryptedFile)
        {
            byte[] decryptedText = Encrypt(sourceKey, encryptedText);
            File.WriteAllText(decryptedFile, Encoding.ASCII.GetString(decryptedText));
        }

    /*------------------------------------------------------------------------------------
     * Metody obslugujace pliki
     * */



        /* Zwraca teskt jawny przekonwertowany do tablicy bajtow*/
        private static byte[] GrabInput(String inputFile)
        {
            try
            {
                return Encoding.ASCII.GetBytes(File.ReadAllText(inputFile));
            }

            catch(FileNotFoundException ex)
            {
                throw new FileNotFoundException("File not found");
            }
            catch(FileLoadException ex)
            {
                throw new FileLoadException("Could not open the file");
            }
        }



        /* Konwertuje wygenerowany tekst zaszyfrowany do tablicy bajtow i zwraca ja. */
        private static byte[] GrabOutput(String outputFile)
        {
            try
            {
                String output = File.ReadAllText(outputFile);
                byte[] byteArray = new byte[output.Length];
                for(int i = 0; i < output.Length; i++)
                {
                    byteArray[i] = (byte)Convert.ToInt32(output[i]);
                }
                return byteArray;
            }

            catch(FileNotFoundException ex)
            {
                throw new FileNotFoundException("File not found");
            }
            catch(FileLoadException ex)
            {
                throw new FileLoadException("Could not open the file");
            }
        }


        /* Zapisuje dana tablice bajtow do podanego pliku. Ze wzgledu
         * Niemodyfikowalnosc stringow w C# konieczne jest uzycie
         * StringBuildera.
         */
        private static void GenerateOutput(byte[] output, String outputFile)
        {
            StringBuilder stringBuilder = new StringBuilder();
            foreach(byte encryptedByte in output)
            {
                stringBuilder.Append(Convert.ToChar(encryptedByte));
            }
            File.WriteAllText(outputFile, stringBuilder.ToString());
        }

    }
}
Editor is loading...