Пример #1
0
        /// <summary>
        /// Дешифратор
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        private static string Decrypt(Packet packet, byte[] key)
        {
            string result = "";
            int    sizeBlock;

            //В зависимости от шифра, выполняются разные действия
            switch (packet.cipher)
            {
            case "Нет":
            case null:
                //Если шифра нет, то просто декодируем байты в текст
                result = Encoding.GetEncoding(866).GetString(packet.data);
                break;

            case "Кузнечик":
                Kuznyechik kuznyechik = new Kuznyechik();
                sizeBlock = 16;

                //Количество байт
                byte[] dataD = new byte[packet.data.Length];

                //В цикле формируем блоки указанного размера...
                for (int i = 0; i < packet.data.Length; i += sizeBlock)
                {
                    byte[] data8bytes = new byte[sizeBlock];

                    for (int k = 0; k < sizeBlock; k++)
                    {
                        data8bytes[k] = packet.data[k + i];
                    }

                    //...и дешифруем каждый блок в отдельности с помощью ключа
                    byte[] dataD8bytes = kuznyechik.decrypt(data8bytes, key);

                    for (int k = 0; k < sizeBlock; k++)
                    {
                        dataD[k + i] = dataD8bytes[k];
                    }
                }

                //Декодируем расшифрованный набор байт в текст
                result = Encoding.GetEncoding(866).GetString(dataD);
                result = result.Replace("┼", "");     //Убираем симвлоы заполнения блока
                break;

            case "Магма":
                //Аналогично Кузнечику
                Magma magma = new Magma();
                sizeBlock = 8;
                dataD     = magma.Decode(packet.data, key);
                result    = Encoding.GetEncoding(866).GetString(dataD);
                result    = result.Replace("┼", "");
                break;

            case "AES":
                //Аналогично Кузнечику
                sizeBlock = 16;

                Aes aes = Aes.Create();
                aes.Mode      = CipherMode.ECB;
                aes.KeySize   = 256;
                aes.BlockSize = sizeBlock * 8;
                aes.Key       = key;
                aes.Padding   = PaddingMode.Zeros;

                ICryptoTransform encryptor = aes.CreateDecryptor();

                dataD  = encryptor.TransformFinalBlock(packet.data, 0, packet.data.Length);
                result = Encoding.GetEncoding(866).GetString(dataD);
                result = result.Replace("┼", "");
                break;

            default:
                result = null;
                break;
            }

            return(result);
        }
Пример #2
0
        /// <summary>
        /// Дешифратор
        /// </summary>
        /// <param name="packet"></param>
        /// <returns></returns>
        static string Decrypt(Packet packet)
        {
            string result = "";

            byte[] dataD;
            int    sizeBlock;

            switch (packet.cipher)
            {
            case "Нет":
            case null:
                result = Encoding.GetEncoding(866).GetString(packet.data);
                break;

            case "Кузнечик":
                Kuznyechik kuznyechik = new Kuznyechik();
                sizeBlock = 16;
                dataD     = new byte[packet.data.Length];

                for (int i = 0; i < packet.data.Length; i += sizeBlock)
                {
                    byte[] data8bytes = new byte[sizeBlock];

                    for (int k = 0; k < sizeBlock; k++)
                    {
                        data8bytes[k] = packet.data[k + i];
                    }

                    byte[] dataD8bytes = kuznyechik.decrypt(data8bytes, key);

                    for (int k = 0; k < sizeBlock; k++)
                    {
                        dataD[k + i] = dataD8bytes[k];
                    }
                }

                result = Encoding.GetEncoding(866).GetString(dataD);
                result = result.Replace("┼", "");
                break;

            case "Магма":
                Magma magma = new Magma();
                dataD  = magma.Decode(packet.data, key);
                result = Encoding.GetEncoding(866).GetString(dataD);
                result = result.Replace("┼", "");
                break;

            case "AES":
                sizeBlock = 16;

                Aes aes = Aes.Create();
                aes.Mode      = CipherMode.ECB;
                aes.KeySize   = 256;
                aes.BlockSize = sizeBlock * 8;
                aes.Key       = key;
                aes.Padding   = PaddingMode.Zeros;

                ICryptoTransform decryptor = aes.CreateDecryptor();

                dataD  = decryptor.TransformFinalBlock(packet.data, 0, packet.data.Length);
                result = Encoding.GetEncoding(866).GetString(dataD);
                result = result.Replace("┼", "");
                break;

            default:
                result = null;
                break;
            }

            return(result);
        }