Пример #1
0
        //Cifrado ZigZag.
        public static void Cipher(NumbersDataTaken info)
        {
            using (var reader = new BinaryReader(info.File.OpenReadStream()))
            {
                //Creacion archivo .zz.
                using (var streamWriter = new FileStream($"{info.Name}.zz", FileMode.OpenOrCreate))
                {
                    using (var writer = new BinaryWriter(streamWriter))
                    {
                        var GrupoOlas = (2 * info.levels) - 2;
                        var len       = (float)reader.BaseStream.Length / (float)GrupoOlas;
                        var cantOlas  = len % 1 <= 0.5 ? Math.Round(len) + 1 : Math.Round(len);
                        cantOlas = Convert.ToInt32(cantOlas);

                        var pos       = 0;
                        var contNivel = 0;

                        var mensaje = new List <byte> [info.levels];

                        for (int i = 0; i < info.levels; i++)
                        {
                            mensaje[i] = new List <byte>();
                        }

                        //Buffer de lectura
                        var bufferLength = 100000;
                        var byteBuffer   = new byte[bufferLength];

                        while (reader.BaseStream.Position != reader.BaseStream.Length)
                        {
                            byteBuffer = reader.ReadBytes(bufferLength);
                            foreach (var caracter in byteBuffer)
                            {
                                if (pos == 0 || pos % GrupoOlas == 0)
                                {
                                    mensaje[0].Add(caracter);
                                    contNivel = 0;
                                }
                                else if (pos % GrupoOlas == info.levels - 1)
                                {
                                    mensaje[info.levels - 1].Add(caracter);
                                    contNivel = info.levels - 1;
                                }
                                else if (pos % GrupoOlas < info.levels - 1)
                                {
                                    contNivel++;
                                    mensaje[contNivel].Add(caracter);
                                }
                                else if (pos % GrupoOlas > info.levels - 1)
                                {
                                    contNivel--;
                                    mensaje[contNivel].Add(caracter);
                                }
                                pos++;
                            }
                        }

                        for (int i = 0; i < info.levels; i++)
                        {
                            var cantIteracion = i == 0 || i == info.levels - 1 ? cantOlas : cantOlas * 2;
                            var inicio        = mensaje[i].Count();
                            for (int j = inicio; j < cantIteracion; j++)
                            {
                                mensaje[i].Add((byte)0);
                            }
                            writer.Write(mensaje[i].ToArray());
                        }
                    }
                }
            }
        }
Пример #2
0
        //Decifrado ZigZag.
        public static void Decipher(NumbersDataTaken info)
        {
            using (var reader = new BinaryReader(info.File.OpenReadStream()))
            {
                //Creacion archivo .txt.
                using (var streamWriter = new FileStream($"{info.Name}.txt", FileMode.OpenOrCreate))
                {
                    using (var writer = new BinaryWriter(streamWriter))
                    {
                        var GrupoOlas   = (2 * info.levels) - 2;
                        var cantOlas    = Convert.ToInt32(reader.BaseStream.Length) / GrupoOlas;
                        var intermedios = (Convert.ToInt32(reader.BaseStream.Length) - (2 * cantOlas)) / (info.levels - 2);

                        var pos            = 0;
                        var contNivel      = 0;
                        var contIntermedio = 0;

                        var mensaje = new Queue <byte> [info.levels];

                        for (int i = 0; i < info.levels; i++)
                        {
                            mensaje[i] = new Queue <byte>();
                        }

                        //Buffer de lectura.
                        var bufferLength = 100000;
                        var byteBuffer   = new byte[bufferLength];

                        while (reader.BaseStream.Position != reader.BaseStream.Length)
                        {
                            byteBuffer = reader.ReadBytes(bufferLength);
                            foreach (var caracter in byteBuffer)
                            {
                                if (contNivel == info.levels - 1)
                                {
                                    mensaje[contNivel].Enqueue(caracter);
                                }
                                else
                                {
                                    if (pos < cantOlas)
                                    {
                                        mensaje[0].Enqueue(caracter);
                                    }
                                    else if (pos == cantOlas)
                                    {
                                        contNivel++;
                                        mensaje[contNivel].Enqueue(caracter);
                                        contIntermedio = 1;
                                    }
                                    else if (contIntermedio < intermedios)
                                    {
                                        mensaje[contNivel].Enqueue(caracter);
                                        contIntermedio++;
                                    }
                                    else
                                    {
                                        contNivel++;
                                        mensaje[contNivel].Enqueue(caracter);
                                        contIntermedio = 1;
                                    }
                                    pos++;
                                }
                            }
                        }

                        contNivel = 0;
                        var direccion = true;

                        //Verdadero hacia abajo y falso hacia arriba.
                        while (mensaje[1].Count() != 0 || (info.levels == 2 && mensaje[1].Count() != 0))
                        {
                            if (contNivel == 0)
                            {
                                writer.Write(mensaje[contNivel].Dequeue());
                                contNivel = 1;
                                direccion = true;
                            }
                            else if (contNivel < info.levels - 1 && direccion)
                            {
                                writer.Write(mensaje[contNivel].Dequeue());
                                contNivel++;
                            }
                            else if (contNivel > 0 && !direccion)
                            {
                                writer.Write(mensaje[contNivel].Dequeue());
                                contNivel--;
                            }
                            else if (contNivel == info.levels - 1)
                            {
                                writer.Write(mensaje[contNivel].Dequeue());
                                contNivel = info.levels - 2;
                                direccion = false;
                            }
                        }
                    }
                }
            }
        }
Пример #3
0
        //Decifrado Ruta Espiral
        public static void Decipher(NumbersDataTaken info)
        {
            using (var reader = new BinaryReader(info.File.OpenReadStream()))
            {
                //Creacion archivo .txt.
                using (var streamWriter = new FileStream($"{info.Name}.txt", FileMode.OpenOrCreate))
                {
                    using (var writer = new BinaryWriter(streamWriter))
                    {
                        //Buffer de lectura.
                        var bufferLength = info.rows * info.columns;
                        var byteBuffer   = new byte[bufferLength];

                        while (reader.BaseStream.Position != reader.BaseStream.Length)
                        {
                            var Matriz = new byte[info.rows, info.columns];
                            byteBuffer = reader.ReadBytes(bufferLength);
                            var cont = 0;

                            for (int i = 0; i < info.rows; i++)
                            {
                                for (int j = 0; j < info.columns; j++)
                                {
                                    if (cont < byteBuffer.Count())
                                    {
                                        Matriz[i, j] = byteBuffer[cont];
                                        cont++;
                                    }
                                    else
                                    {
                                        Matriz[i, j] = (byte)0;
                                    }
                                }
                            }

                            var numVueltas = 0;
                            var posX       = 0;
                            var posY       = 0;
                            var Direccion  = "abajo";

                            for (int i = 0; i < bufferLength; i++)
                            {
                                if (Matriz[posY, posX] != 0)
                                {
                                    if (Direccion == "abajo" && posY != info.rows - 1 - numVueltas)
                                    {
                                        writer.Write(Matriz[posY, posX]);
                                        posY++;
                                    }
                                    else if (Direccion == "abajo" && posY == info.rows - 1 - numVueltas)
                                    {
                                        writer.Write(Matriz[posY, posX]);
                                        posX++;
                                        Direccion = "derecha";
                                    }
                                    else if (Direccion == "derecha" && posX != info.columns - 1 - numVueltas)
                                    {
                                        writer.Write(Matriz[posY, posX]);
                                        posX++;
                                    }
                                    else if (Direccion == "derecha" && posX == info.columns - 1 - numVueltas)
                                    {
                                        writer.Write(Matriz[posY, posX]);
                                        posY--;
                                        Direccion = "arriba";
                                    }
                                    else if (Direccion == "arriba" && posY != numVueltas)
                                    {
                                        writer.Write(Matriz[posY, posX]);
                                        posY--;
                                    }
                                    else if (Direccion == "arriba" && posY == numVueltas)
                                    {
                                        writer.Write(Matriz[posY, posX]);
                                        numVueltas++;
                                        posX--;
                                        Direccion = "izquierda";
                                    }
                                    else if (Direccion == "izquierda" && posX != numVueltas)
                                    {
                                        writer.Write(Matriz[posY, posX]);
                                        posX--;
                                    }
                                    else if (Direccion == "izquierda" && posX == numVueltas)
                                    {
                                        writer.Write(Matriz[posY, posX]);
                                        posY++;
                                        Direccion = "abajo";
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }