public static void StartEncryptDecrypt(string iFileName, string oFileName, UInt64 key, CouplingMode couplingMode, bool isEncrypt = true) { codingValue = 0; _key = key; _wasEncrypted = 0; FileStream iFStream = new FileStream(iFileName, FileMode.Open); using (BinaryReader iFileStream = new BinaryReader(iFStream)) { var lenght = iFStream.Length; //количество байт SetMaximum.Invoke(lenght * 3 / 8); ulong blocks = (ulong)lenght / (ulong)8; //количество unsigned long int (UInt64) ulong cryptedBlocks = 0; UInt64 block = 0; _blocks.Clear(); using (BinaryWriter oFileStream = new BinaryWriter(new FileStream(oFileName, FileMode.Create))) { while (blocks > cryptedBlocks) { block = iFileStream.ReadUInt64(); _blocks.Add(block); //Write(block.ToString()); block = 0; cryptedBlocks++; codingValue++; SetValue.Invoke(codingValue); } if (isEncrypt) { if (lenght % 8 != 0) { for (int i = 0; i < lenght % 8; i++) { var bt = (byte)iFileStream.ReadByte(); block = block << 8; block |= bt; } block = MakeFullBlock(block, (int)(lenght % 8)); } else { block = 8; } _blocks.Add(block); //Write(block.ToString()); codingValue++; SetValue.Invoke(codingValue); } List <UInt64> newBlocks = new List <ulong>(); switch (SetCouplingMode) { case CouplingMode.ECB: newBlocks = ECB(isEncrypt); break; case CouplingMode.CBC: newBlocks = CBC(isEncrypt); break; case CouplingMode.CFB: newBlocks = CFB(isEncrypt); break; case CouplingMode.OFB: newBlocks = OFB(isEncrypt); break; } for (int i = 0; i < newBlocks.Count; i++) { var tmpBlock = newBlocks[i]; if (!isEncrypt && i == newBlocks.Count - 1) { var tmp = MakeCuttedBlock(tmpBlock); if (tmp.Length != 10) { foreach (var b in tmp) { oFileStream.Write(b); } } } else { oFileStream.Write(tmpBlock); //Write(tmpBlock.ToString()); } codingValue++; SetValue.Invoke(codingValue); } EncodeFinished($"Файл\n{iFileName}\nуспешно зашифрован\n\nСоздан файл\n{oFileName}\nс шифротекстом"); } } }
public static void StartEncryptDecrypt(string iFileName, string oFileName, UInt64 key, CouplingMode couplingMode, bool isEncrypt = true) { _key = key; _wasEncrypted = 0; FileStream iFStream = new FileStream(iFileName, FileMode.Open); using (BinaryReader iFileStream = new BinaryReader(iFStream)) { var lenght = iFStream.Length; ulong blocks = (ulong)lenght / (ulong)8; ulong cryptedBlocks = 0; UInt64 block = 0; _blocks.Clear(); using (BinaryWriter oFileStream = new BinaryWriter(new FileStream(oFileName, FileMode.Create))) { while (blocks > cryptedBlocks) { block = iFileStream.ReadUInt64(); _blocks.Add(block); Write(block.ToString()); block = 0; cryptedBlocks++; } if (isEncrypt) { if (lenght % 8 != 0) { for (int i = 0; i < lenght % 8; i++) { var bt = (byte)iFileStream.ReadByte(); block = block << 8; block |= bt; } block = MakeFullBlock(block, (int)(lenght % 8)); } else { block = 8; } _blocks.Add(block); Write(block.ToString()); } List <UInt64> newBlocks = new List <ulong>(); switch (SetCouplingMode) { case CouplingMode.ECB: newBlocks = ECB(isEncrypt); break; case CouplingMode.CBC: newBlocks = CBC(isEncrypt); break; case CouplingMode.CFB: newBlocks = CFB(isEncrypt); break; case CouplingMode.OFB: newBlocks = OFB(isEncrypt); break; } for (int i = 0; i < newBlocks.Count; i++) { var tmpBlock = newBlocks[i]; if (!isEncrypt && i == newBlocks.Count - 1) { var tmp = MakeCuttedBlock(tmpBlock); foreach (var b in tmp) { oFileStream.Write(b); } } else { oFileStream.Write(tmpBlock); Write(tmpBlock.ToString()); } } } } }