答:
八位的碰撞一共有八个
10001101 1010
10011110 1010
10101011 1010
10111000 1010
11000001 1010
11010010 1010
11100111 1010
11110100 1010
代码
a=['1', '0', '0', '1', '1'] #除数
b=['1', '0', '1', '0', '1', '0', '1', '1'] #校验数值
c=['0', '0', '0', '0']
z=b+c
k=4
x=int(''.join(a),2)#先转为字符串再转换成整数
y=int(''.join(z[0:5]),2)
while k<len(z):
xy=list(bin(x^y)[2:])#整数异或
if len(a)-len(xy)>len(z)-k+1:#不足5位结束
break
else:
t=k
k += len(a) - len(xy)
xy+=z[t+1:t+1+len(a)-len(xy)]#借位
y=int(''.join(xy),2)
if len(xy)<4:
xy.insert(0,(4-len(xy))*'0')
K=xy #求出CRC
n=128 #10000000
N=0
while n<=256:#遍历求出碰撞
d = list('{:08b}'.format(n))
z = d + c
y = int(''.join(z[0:5]), 2)
k=4
while k < len(z):
xy = list(bin(x ^ y)[2:])
if len(a) - len(xy) > len(z) - k + 1:
break
else:
t = k
k += len(a) - len(xy)
xy += z[t + 1:t + 1 + len(a) - len(xy)]
y = int(''.join(xy), 2)
if len(xy) < 4:
xy.insert(0, (4 - len(xy)) * '0')
if xy==K:
print(''.join(d),end=' ')
print(''.join(xy))
N+=1
n+=1
print(N)#总数