A51流加密理解和算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A51流加密理解和算法实现
算法理解
A5/1加密算法⽤于GSM蜂窝电话⽹络中的数据机密性加密,其使⽤3个线性反馈移位寄存器简称LFSR,分别为X 19位,Y 22位,Z 23位。
加解密的过程是固定流程的,只需要按照⽅法进⾏轮计算即可,具体⽅法参考:
这个博客是我找的写的⽐较清楚明⽩的了,不要试图去理解为什么这个算法要那么做,因为他就是那样,就像我为什么长着⼿。
python实现
其实⽤C语⾔实现⽐较快,但是最近在学python,所以。
代码:
X = '1010101010101010101'
Y = '1100110011001100110011'
Z = '11100001111000011110000'
n=int(input())
for i in range(n):
maj = int(X[8]) + int(Y[10]) + int(Z[10])
if maj >= 2:
m = 1
else:
m = 0
if int(X[8]) == m: #判断是否要为⾸位赋值
x0 = int(X[13]) ^ int(X[16]) ^ int(X[17]) ^ int(X[18])#求0位值
t = str(bin((int(X, 2) >> 1))) #移位操作
X = t[2:] # 取出0b
X = '0' * (19 - len(X)) + X #补充移位后缺少的前⼏位
X = str(x0) + X[1:] #⾸位赋值
if int(Y[10]) == m:
y0 = int(Y[20]) ^ int(Y[21])
t = str(bin((int(Y, 2) >> 1)))
Y = t[2:] # 取出0b
Y = '0' * (22 - len(Y)) + Y
Y = str(y0) + Y[1:]
if int(Z[10]) == m:
z0 = int(Z[7]) ^ int(Z[20]) ^ int(Z[21]) ^ int(Z[22])
t = str(bin((int(Z, 2) >> 1)))
Z = t[2:] # 取出0b
Z = '0' * (23 - len(Z)) + Z
Z = str(z0) + Z[1:]
S0 = int(X[18]) ^ int(Y[21]) ^ int(Z[22])
print(S0,end=' ')
print("\nX=%s\nY=%s\nZ=%s" % (X, Y, Z))
运⾏结果:
32
1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 0 1
X=0001101000000000000
Y=1111101010101010101010
Z=01101010111100001010101
Process finished with exit code 0。