XOR图像解密后与原图不符,请求排查Python代码问题
图像XOR加解密程序错误排查
我编写了一个基于XOR加密算法的图像加解密程序,但解密后的图像与原始图像不一致,不清楚问题出在哪里。相关原图、解密后图像及Python代码如下:
原图:
解密后图:
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
问题排查与修复
你的代码存在多个逻辑错误,导致解密时密钥序列与加密时不匹配,最终图像异常:
密钥生成逻辑混乱
原代码对不同长度密钥的处理分支存在冲突:- 当密钥长度大于24时,截取
key24后若长度不足,重置pos补全的方式会破坏密钥的连续循环序列;且处理完长密钥分支后,会再次进入短密钥补全循环,修改已生成的key24。 - 短密钥补全时,变量
d未在每次处理像素时重置,导致密钥循环顺序错误。
修复:用取模运算统一生成24位密钥,保证加解密时密钥序列完全一致:
# 替换原密钥处理的所有代码 key24 = '' for k in range(24): key24 += key[(pos + k) % len(key)] pos = (pos + 24) % len(key) # 更新pos,保证下一个像素的密钥连续- 当密钥长度大于24时,截取
冗余代码导致逻辑冲突
原代码先执行key24 = key[pos:pos+24],后续分支又重复赋值,且无论密钥长度是否达标,都会进入补全循环,破坏已正确生成的key24。删除冗余分支,改用统一的取模方式即可解决。XOR逻辑的潜在风险
函数xor_encrypting的逻辑是正确的异或运算(相同位返回0,不同位返回1),但需确保加密程序使用完全相同的逻辑——如果加密时逻辑相反,解密自然无法还原。像素遍历顺序一致性
确认加密程序的像素遍历顺序和当前解密程序完全一致(从左到右、从上到下,按(i,j)坐标处理),否则密钥对应像素的位置错误,也会导致解密图像异常。
内容的提问来源于stack exchange,提问作者slime3000fly
相关产品推荐
相关产品推荐

