/// <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()); }
/// <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); }
/// <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)); }
/// <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); }
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)), });
/// <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); }
/// <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()); }
/// <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); }
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); }
/// <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); }
/// <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));; }