Exemplo n.º 1
0
        /// <summary>
        /// CFB decode.
        /// </summary>
        /// <param name="key">Key</param>
        /// <param name="iv">Init vector</param>
        /// <param name="message">Message</param>
        /// <param name="sBlockType">SBlock type</param>
        /// <returns>Decoded</returns>
        public static byte[] Decode(byte[] key, byte[] iv, byte[] message, SBlockTypes sBlockType)
        {
            CheckData(key, iv, message);

            using var gost = new GostManager(key, iv, message, CipherTypes.Cfb, sBlockType);
            return(gost.Decode());
        }
Exemplo n.º 2
0
        /// <summary>
        /// Simple substitution encode.
        /// </summary>
        /// <param name="key">256 bit key.</param>
        /// <param name="message">Opened message</param>
        /// <param name="sBlockType">STable.</param>
        /// <returns>Encoded message.</returns>
        //
        //Если входящее сообщение не кратно 8 байтам, то дополняем его
        //в каждый свободный бит после расширения блока дописываем значение равное количеству байтов которые мы добавили
        public byte[] SimpleSubstitutionEncode(byte[] key, byte[] message, SBlockTypes sBlockType = SBlockTypes.GOST)
        {
            Key = key;
            //расширение и дописываний байтов
            if (message.Length % 8 != 0)
            {
                int    offset   = 8 - (message.Length - (message.Length / 8) * 8);
                byte[] newarray = new byte[(message.Length / 8) * 8 + 8];
                Array.Copy(message, newarray, message.Length);
                for (int i = message.Length; i < newarray.Length; i++)
                {
                    newarray[i] = (byte)offset;
                }
                Message = newarray;
            }
            else
            {
                SubstitutionEncode(key, message, sBlockType);
            }
            this.sBlockType = sBlockType;
            SetSBlock();

            byte[] encode = SubstitutionProcess(true);
            return(encode);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Substitution decode.
        /// </summary>
        /// <param name="key">Key</param>
        /// <param name="message">Message</param>
        /// <param name="sBlockType">SBlock type</param>
        /// <returns>Decoded</returns>
        public static byte[] Decode(string key, string message, SBlockTypes sBlockType)
        {
            CheckData(key, message);

            var byteKey     = Encoding.Default.GetBytes(key);
            var byteMessage = Encoding.Default.GetBytes(message);

            return(Decode(byteKey, byteMessage, sBlockType));
        }
Exemplo n.º 4
0
        /// <summary>
        /// MAC generator.
        /// </summary>
        /// <param name="key">256 bit key.</param>
        /// <param name="message">Message (not less than 2 blocks).</param>
        /// <param name="sBlockType">SBlock.</param>
        /// <returns>MAC.</returns>
        public byte[] MACGenerator(byte[] key, byte[] message, SBlockTypes sBlockType = SBlockTypes.GOST)
        {
            Key     = key;
            Message = message;

            this.sBlockType = sBlockType;
            SetSBlock();

            byte[] mac = MACProcess();
            return(mac);
        }
Exemplo n.º 5
0
 public static ISBlock SBlock(SBlockTypes sBlock)
 {
     return(sBlock switch
     {
         SBlockTypes.CryptoProA => new CryptoProABlock(),
         SBlockTypes.CryptoProB => new CryptoProBBlock(),
         SBlockTypes.CryptoProC => new CryptoProCBlock(),
         SBlockTypes.CryptoProD => new CryptoProDBlock(),
         SBlockTypes.TC26 => new Tc26Block(),
         SBlockTypes.GOST => new GostBlock(),
         _ => throw new ArgumentException(nameof(sBlock)),
     });
Exemplo n.º 6
0
        /// <summary>
        /// CFB decode.
        /// </summary>
        /// <param name="key">256 bit key.</param>
        /// <param name="iv">64 bit IV</param>
        /// <param name="message">Encoded message.</param>
        /// <param name="sBlockType">STable.</param>
        /// <returns>Opened message.</returns>
        /// <exception cref="Exception"></exception>
        /// <exception cref="ArgumentException"></exception>
        public byte[] CFBDecode(byte[] key, byte[] iv, byte[] message, SBlockTypes sBlockType = SBlockTypes.GOST)
        {
            Key     = key;
            Message = message;
            IV      = iv;

            this.sBlockType = sBlockType;
            SetSBlock();

            byte[] encode = CFBProcess(false);
            return(encode);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Substitution decode.
        /// </summary>
        /// <param name="key">Key</param>
        /// <param name="message">Message</param>
        /// <param name="sBlockType">SBlock type</param>
        /// <returns>Decoded</returns>
        public static byte[] Decode(byte[] key, byte[] message, SBlockTypes sBlockType)
        {
            CheckData(key, message);

            if (message.Length % 8 != 0)
            {
                throw new ArgumentException("Block must have 64 bit length");
            }

            using var gost = new GostManager(key, null, message, CipherTypes.Substitution, sBlockType);
            return(gost.Decode());
        }
Exemplo n.º 8
0
        /// <summary>
        /// Substitution decode.
        /// </summary>
        /// <param name="key">256 bit key.</param>
        /// <param name="message">Encoded message multiple of 64 bit.</param>
        /// <param name="sBlockType">STable.</param>
        /// <returns>Opened message</returns>
        /// <exception cref="Exception"></exception>
        /// <exception cref="ArgumentException"></exception>
        public byte[] SubstitutionDecode(byte[] key, byte[] message, SBlockTypes sBlockType = SBlockTypes.GOST)
        {
            Key     = key;
            Message = message;
            if (message.Length % 8 != 0)
            {
                throw new ArgumentException("Block must have 64 bit length");
            }
            this.sBlockType = sBlockType;
            SetSBlock();

            byte[] decode = SubstitutionProcess(false);
            return(decode);
        }
Exemplo n.º 9
0
        public GostManager(byte[] key, byte[] iv, byte[] message, CipherTypes cipherType = CipherTypes.Substitution,
                           SBlockTypes sBlockType = SBlockTypes.GOST)
        {
            released = false;
            _subKeys = new List <uint>();

            Key     = key;
            IV      = iv;
            Message = message;

            GenerateSubKeys();

            _sBlock = SBlockFactory.SBlock(sBlockType);
            _cipher = CipherFactory.Cipher(_iv, _subKeys, cipherType, _sBlock);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Simple substitution decode.
        /// </summary>
        /// <param name="key">256 bit key.</param>
        /// <param name="message">Opened message</param>
        /// <param name="sBlockType">STable.</param>
        /// <returns>Decoded message.</returns>
        //
        //После расшифровки текста берем количество добавленные байт и обрезаем блок
        public byte[] SimpleSubstitutionDecode(byte[] key, byte[] message, SBlockTypes sBlockType = SBlockTypes.GOST)
        {
            Key             = key;
            Message         = message;
            this.sBlockType = sBlockType;
            SetSBlock();

            byte[] encode = SubstitutionProcess(false);
            int    offset = encode[encode.Length - 1];

            byte[] array = new byte[encode.Length - offset];
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = encode[i];
            }

            encode = array;
            return(encode);
        }
Exemplo n.º 11
0
 /// <summary>
 /// XOR decode.
 /// </summary>
 /// <param name="key">256 bit key.</param>
 /// <param name="iv">64 bit IV</param>
 /// <param name="message">Encoded message.</param>
 /// <param name="sBlockType">STable.</param>
 /// <returns>Opened message.</returns>
 /// <exception cref="Exception"></exception>
 /// <exception cref="ArgumentException"></exception>
 public byte[] XORDecode(byte[] key, byte[] iv, byte[] message, SBlockTypes sBlockType = SBlockTypes.GOST)
 {
     return(XOREncode(key, iv, message, sBlockType));;
 }