在简单的图像加密方法中实现XOR

时间:2010-01-15 04:06:16

标签: c# image xor encryption

所以在你们的帮助下,我完成了创建非常简单的图像加密器。这足以让任何非技术人员离开,对吗? :P

现在进入下一步。有人建议我使用XOR。我读到了XOR,它基本上是一个逻辑表,决定了两位之间的答案,对吧?

只有当一个是真的时,陈述才是真的。

0 0 =假 1 0 =真 0 1 =真 1 1 =假

这是对的吗?那么,我将如何进行XOR加密图像呢?

这是我之前使用Caeser密码的方式。

private void EncryptFile()
    {            
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
        dialog.InitialDirectory = @"C:\";
        dialog.Title = "Please select an image file to encrypt.";
        byte[] ImageBytes;
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            ImageBytes = File.ReadAllBytes(dialog.FileName);

            for (int i = 0; i < ImageBytes.Length; i++)
            {
                ImageBytes[i] = (byte)(ImageBytes[i] + 5);
            }

            File.WriteAllBytes(dialog.FileName, ImageBytes);
        }            
    }

    private void DecryptFile()
    {
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
        dialog.InitialDirectory = @"C:\";
        dialog.Title = "Please select an image file to decrypt.";
        byte[] ImageBytes;
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            ImageBytes = File.ReadAllBytes(dialog.FileName);

            for (int i = 0; i < ImageBytes.Length; i++)
            {
                ImageBytes[i] = (byte)(ImageBytes[i] - 5);
            }

            File.WriteAllBytes(dialog.FileName, ImageBytes);
        }            
    }

3 个答案:

答案 0 :(得分:3)

XOR是两位之间的逻辑运算。好处是,如果您第二次运行XOR,它将在第一次撤消。所以将代码更改为

ImageBytes[i] = (byte)(ImageBytes[i] ^ 5);

答案 1 :(得分:0)

对不起,我没有更清楚地回答你的初步问题。

XOR只是一个按位运算符。在C#中,^字符用于此操作。基本上你只需要替换

 ImageBytes[i] = (byte)(ImageBytes[i] + 5);

通过

 ImageBytes[i] = (byte) (ImageBytes[i] ^ (byte) 0xA9);  // or some other value

完全相同的行(如第二行)可用于解码,因为((X XOR Y)XOR Y)= X,无论X和Y是什么。

正如我在上一个问题中回答的那样,而不是使用一个单独的值来添加(或者XOR),你应该使用一个小数组,(在数组中循环,一遍又一遍,可能有一些“扭曲”) ,例如数组中的每个其他循环,只从数组中取出奇数元素)。以这种方式,得到的编码文件更难以“破解”。 (总的来说,这些加密方案仍然非常简单,只是让非技术方面的人员处于困境中。)

答案 2 :(得分:0)

Papuccino1,你可能已经想到了。 。 。使用XOR并不是真正意义上的加密。这是一个漫无边际的答案,但这只是“隐藏”一个图像 - 它肯定不加密它。但另外,正如之前的消息所暗示的那样,XOR的一个有趣的副作用是它是“可逆的”。

因此

Vx XOR Vy => Vz where V is a byte array of some arbitrary length.

假设Vx是你的图像,你可以创建一个完全由Vx长的随机数组成的数组Vy,并用它来为你的'XOR'引擎播种以生成Vz。如果你然后放弃Vx,并使Vy'私有',只有你知道现在有'隐藏'图像。然后你可以使用Vz XOR vy =&gt;获得原始图像。这很快,特别是如果它都在内存中完成的话。有趣的是,如果你现在逻辑上用DISKn STRIPE替换'Vn',那么你有RAID 5!想象一下,您丢弃的Vx是RAID5集中的3个磁盘驱动器中的1个,并且该驱动器变坏了。因为它仍然有两个驱动器和一个XOR引擎,您可以动态地重新创建丢失的数据。当替换工作驱动器时,XOR引擎会重新生成原始数据。 XOR很酷。 。 。这真的没有回答他的第一个问题,它已经晚了,我的数学可能会关闭。 。 。抱歉絮絮叨叨!