加密解密算法异常:加入xor_8_pixels后解密无法还原原始图像
问题分析与修复方案
你的问题核心是解密流程中操作顺序、XOR处理逻辑完全不符合加密的逆过程,导致加入xor_8_pixels后无法还原原始图像。
加密流程的每轮操作逻辑
先明确加密单轮的执行顺序(以第i轮为例):
- 将64像素块拆分为8个8像素子块
[B0, B1, ..., B7] - 对j从0到6依次执行:
Bj = Bj XOR Bj-1(j=0时,Bj-1为B7)
- 对所有8个子块执行
OwnFunctionEncrypt - 若不是最后一轮,对块列表执行左移
解密的核心要求
解密必须严格执行加密的逆操作,顺序完全颠倒:
- 加密是「XOR → 加密函数 → 左移」,解密则是「右移 → 解密函数 → 逆XOR」(对应前15轮)
- 逆XOR需要倒序处理(从j=6到0),因为加密时后续块的XOR依赖前面已修改的块,解密时必须从最后修改的块开始还原,避免覆盖依赖值
修正后的解密函数
def decryption(input_value, key_value): keyList = create_key_list(key_value) result = [] input_blocks = [] for i in range(8): sub_block = (input_value[8*i:8*i+8]) input_blocks.append(sub_block) for i in range(16): # 对应加密的第15-i轮密钥 current_key = keyList[15 - i] # 第一步:先执行解密函数,还原加密前的XOR中间值 for j in range(8): input_blocks[j] = OwnFunctionDecrypt(input_blocks[j], current_key[j]) # 第二步:逆加密时的XOR操作,倒序处理j从6到0 for j in range(6, -1, -1): if j == 0: # j=0时,加密用的是原始B7,逆操作再次XOR B7 input_blocks[j] = xor_8_pixels(input_blocks[j], input_blocks[7]) else: # 加密时Bj = Bj XOR Bj-1(已修改的),逆操作再次XOR Bj-1(解密后的中间值) input_blocks[j] = xor_8_pixels(input_blocks[j], input_blocks[j-1]) # 第三步:对应加密的左移,执行右移(最后一轮解密不需要) if i < 15: input_blocks = right_shift(input_blocks) # 拼接结果 for i in range(8): for j in range(8): result.append(input_blocks[i][j]) return result
关键修复点说明
- 操作顺序修正:先执行
OwnFunctionDecrypt再处理逆XOR,确保解密函数作用在加密后的原始值上,还原出加密时的XOR中间值。 - XOR处理顺序修正:从j=6到0倒序处理,避免还原前面的块时覆盖后面块需要依赖的中间值。
- XOR操作对象修正:直接修改
input_blocks[j](和加密逻辑一致),通过再次XOR实现逆操作(XOR是自逆运算,两次XOR可还原原始值)。
内容的提问来源于stack exchange,提问作者Some_chirag
相关产品推荐
相关产品推荐

