输入图像是分解为 64 像素块的灰度图像。加密函数采用 64 像素(512 位)作为 input_value 和 64 位密钥。我们将 input_value 分割为 8 个像素值的块。我们对一组 8 个像素进行 16 轮加密。每个其他函数都会进行一些计算并以类似的格式返回值。
当 for 循环中未使用 xor_8_pixels 函数时,加密和解密的代码都能正确执行。添加 xor_8_pixels 函数时,解密没有返回原始输入图像。(很可能我没有在解密中正确定位 xor 函数)
def encryption(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)
# print(input_blocks)
for i in range(16): #16 rounds
for j in range(8):
if j < 7:
input_blocks[j] = xor_8_pixels(input_blocks[j], input_blocks[j - 1])
input_blocks[j]=OwnFunctionEncrypt(input_blocks[j], keyList[i][j])
if i < 15:
input_blocks = left_shift(input_blocks)
# print(input_blocks)
for i in range(8):
for j in range(8):
result.append(input_blocks[i][j])
return result
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)
# print(input_blocks)
for i in range(16): # 16 rounds
for j in range(8):
if j < 7:
input_blocks[j + 1] = xor_8_pixels(input_blocks[j], input_blocks[j + 1])
input_blocks[j] = OwnFunctionDecrypt(input_blocks[j], keyList[15 - i][j]) # Decrypt
# XOR with the next block
if i < 15:
input_blocks = right_shift(input_blocks)
# print(input_blocks)
for i in range(8):
for j in range(8):
result.append(input_blocks[i][j])
return result
即使没有看到您的代码,您也可能将其中一个异或放在错误的位置。您想在“CBC 模式”中进行加密。
在加密中,您采用最新的输出块并进行异或 加密之前的下一个输入块
在解密中,您采用最近的密文并对其进行异或 与当前解密的结果。
请注意,这些不是对称的。维基百科页面上的图片应该会更清楚。