Example #1
0
        /// <summary>
        /// First 8 rounds of encryption
        /// </summary>
        private void EncryptionRounds()
        {
            byte[] data = new byte[8];
            //srcFileStream.Seek(startIndex, SeekOrigin.Begin);
            sbyte bytesCount = (sbyte)SrcFileStream.Read(data, 0, 8);

            if (bytesCount == -1)
            {
                return;
            }
            if (bytesCount < 8)
            {
                for (int i = bytesCount; i < 8; i++)
                {
                    data[i] = 0;
                }
            }

            //преобразование в 16 битные(2 байтные) блоки
            ushort[] blocks = new ushort[4];
            for (int i = 0; i < 4; i++)
            {
                blocks[i] = BitConverter.ToUInt16(data, i * 2);
            }

            //раунды шифрования
            for (int i = 0; i < 48; i += 6)
            {
                EncryptionRound(blocks, i);
            }
            EncryptionLastRound(blocks);

            //преобразование обратно в байты
            byte[] temp = null;
            for (int i = 0; i < 8; i += 2)
            {
                temp        = BitConverter.GetBytes(blocks[i / 2]);
                data[i]     = temp[0];
                data[i + 1] = temp[1];
            }

            ////запись в файл
            //if (bytesCount < 8)
            //    resFileStream.Write(data, 0, bytesCount);
            //else
            ResFileStream.Write(data, 0, 8);
        }
Example #2
0
        /// <summary>
        /// Encrypt file with IDEA encryption
        /// </summary>
        public void Encrypt()
        {
            GenerateKeys();
            var md5 = MD5.Create().ComputeHash(SrcFileStream);

            CreateKeyFile(md5);

            //запись MD5 хеша в зашифрованный файл
            ResFileStream.Write(md5, 0, md5.Length);

            //шифрование файла
            SrcFileStream.Seek(0, SeekOrigin.Begin);
            ResFileStream.WriteByte((byte)(8 - (SrcFileStream.Length % 8)));
            for (long i = 0; i < SrcFileStream.Length; i += 8)
            {
                EncryptionRounds();
            }
            ResFileStream.Flush();
        }
Example #3
0
        /// <summary>
        /// Decrypt the file encrypted IDEA encryption
        /// </summary>
        /// <param name="SrcFileStream">Input file stream of the encrypted file</param>
        /// <param name="ResFileStream">Output file stream of the decrypted file</param>
        /// <param name="KeyFileStream">Input file stream of the key file</param>
        public void Decrypt()
        {
            GenerateKey();

            SrcFileStream.Seek(17, SeekOrigin.Begin);
            ResFileStream.Seek(0, SeekOrigin.Begin);
            for (long i = 17; i < SrcFileStream.Length; i += 8)
            {
                DecryptionRounds();
            }
            SrcFileStream.Seek(16, SeekOrigin.Begin);
            byte offset = (byte)SrcFileStream.ReadByte();

            if (!(offset == 8))
            {
                ResFileStream.SetLength(ResFileStream.Length - SrcFileStream.ReadByte());
            }
            ResFileStream.Flush();
        }