代码之家  ›  专栏  ›  技术社区  ›  Sergio Tapia

用一种简单的图像加密方法实现XOR

  •  1
  • Sergio Tapia  · 技术社区  · 15 年前

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

    现在进入下一步。有人建议我用XOR。我读过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);
            }            
        }
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   John Saunders    15 年前

    xor是两位之间的逻辑运算。好处是,如果您再次运行XOR,它将在第一次撤销。所以把代码改成

    ImageBytes[i] = (byte)(ImageBytes[i] ^ 5);
    
        2
  •  0
  •   mjv    15 年前

    很抱歉,我在回答你最初的问题时没有说清楚。

    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是什么。

    正如我在前一个问题中的回答所暗示的,您应该使用一个小数组(通过数组循环,反复循环,可能有一些“扭曲”,比如数组中的其他循环,只从数组中获取奇数元素)。以这种方式,生成的编码文件很难“破解”。(总的来说,这些加密方案仍然相当简单,只会让非技术导向的人望而却步)。

        3
  •  0
  •   TheEruditeTroglodyte    15 年前

    巴布奇诺1号,你可能已经知道了。…使用XOR并不是真正意义上的加密。这是一个有点杂乱无章的答案,但这只是“隐藏”了一个图像——它当然不会加密它。但作为一个旁白,xor的一个有趣的副作用,正如在前面的消息中提到的,是它是“可逆的”。

    因此

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

    假设vx是你的图像,你可以创建一个数组vy,精确的vx长的随机数,并用它来种子你的“xor”引擎来产生vz。如果你抛弃VX,让VY“私有”,只知道你现在有“隐藏”的图像。然后可以使用vz xor vy=>获取原始图像。这很快,尤其是在记忆中。有趣的是,如果您现在逻辑上用diskn条带替换“vn”,那么您就有了raid 5!假设您丢弃的VX是RAID5中3个磁盘驱动器中的1个,并且该驱动器出现故障。因为它还剩下两个驱动器和一个XOR引擎,所以您可以动态地重新创建丢失的数据。当替换工作驱动器时,XOR引擎会重新生成原始数据。XOR很酷。..。这真的没有回答他的第一个问题,很晚了,我的数学可能就不好了。..。对不起,闲聊!