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