A5/1流加密理解和算法實現


算法理解

​ A5/1加密算法用於GSM蜂窩電話網絡中的數據機密性加密,其使用3個線性反饋移位寄存器簡稱LFSR,分別為X 19位,Y 22位,Z 23位。

​ 加解密的過程是固定流程的,只需要按照方法進行輪計算即可,具體方法參考:https://www.cnblogs.com/gambler/p/9074356.html

這個博客是我找的寫的比較清楚明白的了,不要試圖去理解為什么這個算法要那么做,因為他就是那樣,就像我為什么長着手。


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM