这个C#代码在做什么?

时间:2015-03-12 07:36:51

标签: c# encryption

你能帮我理解这个C#代码吗?我没有任何C#编程经验(但我对Delphi,Pascal,C / C ++以及JS中的一点知识)

我可以看到此代码正在尝试加密某些 in.jpg 文件并将加密数据保存在 out.jpg 中。但我无法理解这种加密算法。

抱歉我的英文。

// Decompiled with JetBrains decompiler

using System;
using System.Collections.Generic;
using System.IO;

namespace ConsoleApplication2
{
  internal class Program
  {
    private static void Encrypt(FileStream inFile, FileStream outFile)
    {
      BinaryReader binaryReader = new BinaryReader((Stream) inFile);
      Dictionary<byte, byte> dictionary = new Dictionary<byte, byte>(256);
      BinaryWriter binaryWriter = new BinaryWriter((Stream) outFile);
      byte num1 = (byte) 0;
      do
      {
        try
        {
          byte key = binaryReader.ReadByte();
          if (!dictionary.ContainsKey(key))
            dictionary.Add(key, num1++);
        }
        catch (ArgumentException ex)
        {
        }
        catch (EndOfStreamException ex)
        {
          break;
        }
      }
      while ((int) num1 <= (int) byte.MaxValue);
      binaryReader.BaseStream.Position = 0L;
      for (int index = 0; index < 256; ++index)
        dictionary[(byte) index] = (byte) ((uint) (ushort) index ^ (uint) dictionary[(byte) index]);
      byte num2 = (byte) 0;
      while (true)
      {
        try
        {
          byte index = binaryReader.ReadByte();
          byte num3 = (byte) ((uint) dictionary[index] + (uint) num2);
          num2 = num3;
          binaryWriter.Write(num3);
          binaryWriter.Write((byte) ((uint) dictionary[index] ^ (uint) index));
        }
        catch (EndOfStreamException ex)
        {
          break;
        }
      }
      binaryReader.Close();
      binaryWriter.Close();
    }

    private static void Main(string[] args)
    {
      FileStream inFile = new FileStream("in.jpg", FileMode.Open, FileAccess.Read);
      FileStream outFile = new FileStream("out.jpg", FileMode.Create, FileAccess.Write);
      Program.Encrypt(inFile, outFile);
      inFile.Close();
      outFile.Close();
    }
  }
}

1 个答案:

答案 0 :(得分:1)

这基本上是一回事:

static void Main(string[] args)
{
  int b, i = 0;
  var input = Console.OpenStandardInput();
  var output = Console.OpenStandardOutput();
  while ((b = input.ReadByte()) != -1)
  {
    output.WriteByte((byte)(b ^ i));
    i++;
  }
}

<强>用法:

Program.exe < inputfile > outputfile

运行一次以加密&#39;,再次在输出文件上运行以解密&#39;。

注意:这是 NOT 加密。

您可以将内容与diffcomp或您喜欢的差异工具进行比较。