循环冗余校验码CRC算法实现和求出碰撞值

image-20200328163113528

答:

八位的碰撞一共有八个

10001101 1010
10011110 1010
10101011 1010
10111000 1010
11000001 1010
11010010 1010
11100111 1010
11110100 1010

image-20200328163126254

代码

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)#总数
posted @ 2020-03-28 19:49  rower  阅读(364)  评论(0编辑  收藏  举报