我试图实现wikipedia上提到的simple algorithm来使用(2 n) secret sharing images创建一个python
有一个简单的二进制(黑白)视觉加密算法,可以从原始未加密图像创建两个加密图像。算法如下:首先创建一个大小和形状与原始图像相同的随机像素图像。接下来,创建与第一个相同大小和形状的第二个图像,但如果原始图像的像素与第一个加密图像中的相应像素相同,则将第二个加密图像的相同像素设置为相反的颜色。如果原始图像的像素不同于第一加密图像中的相应像素,则将第二加密图像的相同像素设置为与第一加密图像的相应像素相同的颜色。现在可以使用异或(xor)将这两个明显随机的图像组合起来重新创建原始图像。
这是生成share1 and share2的代码。

    share1 = Image.new("1", size, "white")
    share1pix = share1.load()
    for i in range(len(self.key)):
        for j in range(255):
            x = randint(0,1)
            if x == 0:
                share1pix[j, i] = 0
    share2 = Image.new("1", size)
    share2pix = share2.load()
    for i in range(len(self.key)):
        for j in range(255):
            if pix[j, i] == share1pix[j, i]:
                if pix[j, i] == 255:
                    share2pix[j, i] = 0
                else:
                    share2pix[j, i] = 255
            else:
                share2pix[j, i] = share1pix[j, i]

其中pix是原始图像数组。但是,我得到的输出是
原始图像
python - (2 n)使用Python的视觉密码学-LMLPHP
共享1
python - (2 n)使用Python的视觉密码学-LMLPHP
共享2
python - (2 n)使用Python的视觉密码学-LMLPHP
如您所见,share2.png不是随机的。这只是original.png的反面我哪里做错了?请帮忙。蒂亚。

最佳答案

你的算法有点错误其思想是,对于pixshare1share2的每个像素,我们有以下关系:

share2 = pix XOR share1

这意味着:
if pix[j, i] == share1[j, i]:
  share2[j, i] = 0
else:
  share2[j, i] = 255

10-08 14:38