设计思路:
在设计算法之前,我们先编写一些功能模块。
- 定义函数left()和right(),通过参数传递,分别返回参数的first and last
def left(Str):
return Str[:int(len(Str) / 2)]
def right(Str):
return Str[int(len(Str) / 2):]
- L⊗R L ⊗ R 运算即 L×R mod RCi∈F24 L × R m o d R C i ∈ F 2 4 ,我们通过函数modular_Reduction()实现该功能,最后返回四位二进制位
def modular_Reduction(str1, str2, px="10011"):
# 两个二进制相乘的结果 考虑系数偶数次为0
res = "00000000"
for i in range(len(str2)):
if int(str2[i]) == 1:
str1_temp = str1
for j in range(len(str2)-i-1):
str1_temp = str1_temp+"0"
res = str_xor(str1=res, str2=str1_temp, len=8)
# 获得乘积 接下里进行模约减
for i in range(int(len(res)/2)):
if int(res[i]) == 0:
res = res
else:
j = len(res) - i - 5
px_temp = px
for k in range(j):
px_temp = px_temp + "0"
res = str_xor(str1=res, str2=px_temp, len=8)
return res[-4:]
- L⊕R L ⊕ R 运算即 L L 与 按位异或运算,我们通过函数str_xor()实现该功能;
def str_xor(str1, str2, len=4):
num1 = int(str1, base=2)
num2 = int(str2, base=2)
return int2bin(int(bin(num1 ^ num2), 2), len)
- 由于题目中大多数是八位二进制位,因此十进制转为二进制后当前位数小于8时,我们通过函数int2bin()