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