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с шифротекстом");
                }
            }
        }
예제 #2
0
        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());
                        }
                    }
                }
            }
        }