Пример #1
0
      /// <summary>Determines whether a stream uses X3:TC file encryption.</summary>
      /// <param name="s">stream.</param>
      /// <returns></returns>
      bool  EncryptedX3Stream::IsEncrypted(StreamPtr s)
      {
         // Verify length
         if (s->GetLength() < 3)
            return false;
         
         // Prepare
         DWORD origin = s->GetPosition();
         WORD  header, key;

         // Generate key: XOR first byte with 0xC8
         s->Seek(0, SeekOrigin::Begin);
         s->Read(reinterpret_cast<byte*>(&key), 1);
         key ^= DECRYPT_SEED;

         // Generate WORD from first byte
         reinterpret_cast<byte*>(&key)[1] = reinterpret_cast<byte*>(&key)[0];

         // Read encrypted 2-byte header. reset position
         s->Read(reinterpret_cast<BYTE*>(&header), 2);
         s->Seek(origin, SeekOrigin::Begin);

         // Check for encrypted GZip header 
         return (header ^ key) == 0x8b1f;
      }