1

所以在你们的帮助下,我完成了我非常简单的图像加密器的创建。将任何非技术人员拒之门外就足够了,对吧?:P

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

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

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

它是否正确?那么,我将如何对图像进行 XOR 加密呢?

这是我以前使用凯撒密码的方法。

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);
        }            
    }
4

3 回答 3

3

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

ImageBytes[i] = (byte)(ImageBytes[i] ^ 5);
于 2010-01-15T04:16:29.953 回答
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),(一遍又一遍地循环遍历数组,可能带有一些“扭曲”,例如数组中每隔一个循环,只取数组中的奇数个元素)。以这种方式,生成的编码文件更难“破解”。(总的来说,这些加密方案仍然非常简单,只是让非技术型的人望而却步)。

于 2010-01-15T04:16:50.157 回答
0

Papuccino1,你可能已经猜到了。. . 使用 XOR 并不是真正意义上的加密。这是一个有点漫不经心的答案,但这只是“隐藏”了一个图像——它当然不会加密它。但顺便说一句,XOR 的一个有趣的副作用,正如在之前的消息中提到的那样,是它是“可逆的”。

所以

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

Let say that Vx is your image, you can create an array Vy of exactly Vx long of random numbers and use it to seed your 'XOR' engine to produce Vz. If you then discard Vx, and make Vy 'private' and known only to you now have 'hidden' image. You can then use Vz XOR vy => to get the original image. This is fast, especially if it's all done in memory. Interestingly enough, if you now logically replace 'Vn' with DISKn STRIPEs, then you have RAID 5! Imagine that the Vx that you discarded is 1 of 3 disk drives in a RAID5 set, and that drive went bad. Because it still has two drives left, and an XOR engine, you can re-create missing data on the fly. When a working drive is substituted, the XOR engine regenerates the original data. XOR is cool stuff . . . This really doesn't answer his first question, its late and my math might be off . . . sorry for the ramble!

于 2010-01-15T05:23:03.723 回答