You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XOR图像解密后与原图不符,请求排查Python代码问题

图像XOR加解密程序错误排查

我编写了一个基于XOR加密算法的图像加解密程序,但解密后的图像与原始图像不一致,不清楚问题出在哪里。相关原图、解密后图像及Python代码如下:

原图:original
解密后图:after decryption

def decode(key):
    from PIL import Image
    from tqdm import tqdm

    def xor_encrypting(color_in: str, key_in: str):
        if color_in == key_in:
            return '0'
        else:
            return '1'

    img=Image.open('secret.jpg')
    width = int(img.width)
    height = int(img.height)
    pixel_map = img.load()

    pos = 0

    for i in tqdm(range(width),'decode'):
        for j in range(height):
            r, g, b = img.getpixel((i, j))
            color = bin(r)[2:].zfill(8) + bin(g)[2:].zfill(8) + bin(b)[2:].zfill(8)
            key24 = key[pos:pos+24]
            d = 0

            # making key for 1 pixel
            if len(key) != 24:
                if len(key) > 24:
                    key24 = key[pos:pos+24]
                    pos += 24
                    if len(key24) < 24:
                        pos = 0
                        while len(key24) < 24:
                            key24 = key24 + key[pos]
                            pos += 1

                # repet too short key
                while len(key24) < 24:
                    if d >= len(key)-1:
                        d = 0
                    key24 = key24 + key[d]
                    d += 1

            # decode
            new_color = ''
            for k in range(24):
                new_color += xor_encrypting(color[k], key24[k])

            pixel_map[i, j] = (int(new_color[0:8], 2), int(
                new_color[8:16], 2), int(new_color[16:24], 2))

    print(len(color))
    img.show()
    return pixel_map

问题排查与修复

你的代码存在多个逻辑错误,导致解密时密钥序列与加密时不匹配,最终图像异常:

  1. 密钥生成逻辑混乱
    原代码对不同长度密钥的处理分支存在冲突:

    • 当密钥长度大于24时,截取key24后若长度不足,重置pos补全的方式会破坏密钥的连续循环序列;且处理完长密钥分支后,会再次进入短密钥补全循环,修改已生成的key24。
    • 短密钥补全时,变量d未在每次处理像素时重置,导致密钥循环顺序错误。
      修复:用取模运算统一生成24位密钥,保证加解密时密钥序列完全一致:
    # 替换原密钥处理的所有代码
    key24 = ''
    for k in range(24):
        key24 += key[(pos + k) % len(key)]
    pos = (pos + 24) % len(key)  # 更新pos,保证下一个像素的密钥连续
    
  2. 冗余代码导致逻辑冲突
    原代码先执行key24 = key[pos:pos+24],后续分支又重复赋值,且无论密钥长度是否达标,都会进入补全循环,破坏已正确生成的key24。删除冗余分支,改用统一的取模方式即可解决。

  3. XOR逻辑的潜在风险
    函数xor_encrypting的逻辑是正确的异或运算(相同位返回0,不同位返回1),但需确保加密程序使用完全相同的逻辑——如果加密时逻辑相反,解密自然无法还原。

  4. 像素遍历顺序一致性
    确认加密程序的像素遍历顺序和当前解密程序完全一致(从左到右、从上到下,按(i,j)坐标处理),否则密钥对应像素的位置错误,也会导致解密图像异常。

内容的提问来源于stack exchange,提问作者slime3000fly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:20:28