当我尝试对一个数字与另一个随机数字进行对称加密(按位异或执行)时,我发现了一个有趣的现象。加密和解密的执行时间不同,相差可能是4到6倍(加密周期:1.2秒,解密周期:0.2秒)。加密执行比解密花费更多时间。我很困惑为什么会造成这种差异。我已附上下面的代码。
# Encryption Execution
start_time = time.time()
encrypted_figure = differential_fig(origin_img, input_random_img, 1)
end_time = time.time()
# Decryption Execution
start_time = time.time()
decrypted_figure = differential_fig(encrypted_figure, input_random_img, 0)
end_time = time.time()
# Called Function
def element_xor(first_array, second_array):
array_size = first_array.size
output_array = np.zeros(array_size, dtype=np.int32)
for e in range(array_size):
output_array[e] = first_array[e] ^ second_array[e]
return output_array
def sliding_window_differential(raw_array, random_array, raw_size, random_size, flag):
indexes_list = []
times = range(math.floor(raw_size / random_size))
num_remain_elements = raw_size % random_size
for j in times:
start_index = j * random_size + num_remain_elements
end_index = start_index + random_size
indexes_list.append([start_index, end_index])
iterative_index = [[0, random_size]] + indexes_list
if not flag: # flag 1: encrypt, 0: decrypt
iterative_index.reverse()
for start_index, end_index in iterative_index:
raw_array[start_index:end_index] = element_xor(raw_array[start_index:end_index],
random_array)
return raw_array
def differential_fig(raw_img, random_img, encrypt_flag):
o_h, o_w, o_c = raw_img.shape
mid_img = random_img[0, :, :, :]
output_figure = np.zeros((o_h, o_w, o_c), dtype=np.int32)
for i in range(o_c):
e_raw_img = raw_img[:, :, i].flatten()
e_random_img = mid_img[:, :, i].flatten()
origin_size = e_raw_img.size
random_size = e_random_img.size
if origin_size > random_size:
e_raw_img = sliding_window_differential(e_raw_img, e_random_img, origin_size,
random_size, encrypt_flag)
else:
e_random_img = e_random_img[:origin_size]
e_raw_img = element_xor(e_raw_img, e_random_img)
output_figure[:, :, i] = e_raw_img.reshape(o_h, o_w)
return output_figure
有人能解释一下这个现象吗? 或者提出改进流程的建议。
list.reverse
方法创建给定列表的副本,其中项目按相反顺序排列,复制所需的时间与列表中项目的数量成正比。您可以使用 reverse
函数以相反的顺序生成项目,以避免进行复制。调用生成器仍然会有开销,但会比复制小得多。
改变:
iterative_index.reverse()
至:
iterative_index = reverse(iteratie_index)