Python 如何对列表中指定的位进行异或运算

Python 如何对列表中指定的位进行异或运算,python,bitmap,cryptography,pattern-matching,xor,Python,Bitmap,Cryptography,Pattern Matching,Xor,上下文: 我正在创建一个可视化的一次性pad程序,它将输入位图拆分为两个不同的随机位列表,当XOR合并在一起时,应该会重现输入位图,有点像“反向工程” 作为一个高度简化的解释,每个新创建的位图将被提供给两个独立的接收者。如果他们的结合形成一个特定的形状,他们可能相互信任(见下文) 在上面的例子中,像素输入和最终输出在中间形成一个心脏形状。 尝试:最初,我的代码成功地将适当的位分配给两个单独的列表,具体取决于输入位是零还是一。(随机性包括在内,因为我希望每次都有不同的输出。)当输入只是在白色背景

上下文:

我正在创建一个可视化的一次性pad程序,它将输入位图拆分为两个不同的随机位列表,当XOR合并在一起时,应该会重现输入位图,有点像“反向工程”

作为一个高度简化的解释,每个新创建的位图将被提供给两个独立的接收者。如果他们的结合形成一个特定的形状,他们可能相互信任(见下文)

在上面的例子中,像素输入和最终输出在中间形成一个心脏形状。


尝试:最初,我的代码成功地将适当的位分配给两个单独的列表,具体取决于输入位是零还是一。(随机性包括在内,因为我希望每次都有不同的输出。)当输入只是在白色背景上显示一个黑色(即一串1)心脏时,这一切都很好:

然而,如果输入在心脏形状以外的区域包含1,我的代码显然不会产生期望的结果,因为条件不能区分我们所感知的“形状”


问题:我如何更改代码以可能识别我指定形状的位,并仅将“案例B”应用于此类对应部分?我对regex不是很熟悉,但这可能会解决这些边缘问题吗

编辑(澄清):

我的代码在以下情况下失败,例如:
虽然我可以选择输入,这样只有heart==1(如上面标记为“binary repr.”的图像),但在这种情况下,用户可以立即看到他们接收到的位图将形成一个heart,而无需使用XOR ing,这是我希望避免的。因此,我需要在给定任何噪声输入的情况下,以某种方式将“案例B”应用于所需的“指定”区域,即心脏。

我不知道为什么您希望心脏周围出现随机噪声,但只需使用
temp2.append(random.choice((0,1))
独立于
randbit
的值即可(对于案例A,如果
0
表示白色,心脏为黑色)


毕竟,两个随机位异或在一起仍然会生成一个随机位值。

您的要求不太清楚。您的代码似乎做了您希望它为正确的
输入像素所做的事情。
。让代码“识别指定形状的位”是什么意思输入形状完全由您的
input_pixels
指定?@JeffH
input_pixels
确实是固定的,但我想将情况B应用于所需的心形,而情况A应用于散落在周围的其他黑色像素作为噪波;请参阅我的编辑以了解有关为什么要添加随机噪波的更多详细信息;因为收件人(或者更确切地说,是对手)由于XORIf的性质,可以很容易地推断出哪个位图对应于心脏形成共享。如果你有一个真正的随机位图,并将其与原始图片进行XOR,那么结果将是随机的,并且位图本身都不应该给出任何关于心脏形状的信息。许多密钥共享方案正是基于这一原理。所以我猜你的假设是错误的。啊,当然,我现在意识到你的方法要简单得多;谢谢。我的方法确实有效,只是它需要非常非常规的步骤,将原始图片分割成两个单独的位图(在这个阶段加入随机喷洒)
input_pixels = [[0,0, ... 0], [0,0, ... 0], ... , [0,1, ... 1,0]]  ## I've shortened here

bitmap1 = []
bitmap2 = []

for row in input_pixels:
    temp1 = []
    temp2 = []

    for bit in row:
        ## 'Case A' when a bit in input_pixels is 0
        if bit == 0:
            randbit = random.choice((0, 1))
            temp1.append(randbit)
            if randbit == 1:
                temp2.append(1)
            else:
                temp2.append(0)

        ## 'Case B' when a bit in input_pixels is 1
        else:
            randbit = random.choice((0, 1))
            temp1.append(randbit)
            if randbit == 1:
                temp2.append(0)
            else:
                temp2.append(1)

    bitmap1.append(temp1)
    bitmap2.append(temp2)