python实现A5/1算法

注: 根据老师所说,是当明文大于64位的时候,系统才循环生成密钥,如果小于64位,直接和随机产生的64位的二进制数进行异或即可。所以下面程序要进行微量更改才算正确。

  • 发送方Alice_send.py
# Alice_send.py
import random as r


# 随机产生64位二进制数
def rand64():
    randstr64 = ""
    for i in range(64):
        randstr64 = randstr64 + str(r.randint(0, 1))
    return  randstr64


# 字符变成2进制
def encode(s):
    res = []
    for c in s:
        tem = bin(ord(c)).replace('b', '')
        # 转为字符串时,后7位中,如果存在前面为0,会自动去掉,需要加回来,使之满足8位
        if len(tem) < 8:
            tem = "0" + tem
        res.append(tem)
    return ''.join(res)


# 2进制变成字符
def decode(s):
    return ''.join([chr(e) for e in [int(b, 2) for b in [s[8 * j: 8 * (j + 1)] for j in range(int(len(s) / 8))]]])


# 投票函数
def mag(a, b, c):
    d = a + b + c
    if d < 2:
        return 0
    else:
        return 1


# 右移动
def turn(s, p):
    return p + s[:-1]


# 2机制到16进制
def bin_hex(s):
    return ''.join([hex(e).replace('0x', '') for e in [int(b, 2) for b in [s[4 * j: 4 * (j + 1)] for j in range(int(len(s) / 4))]]]).upper()


# 16进制到2进制
def hex_bin(s):
    res = []
    for c in s:
        tem = bin(int(c, 16)).replace('0b', '')
        while True:
            if len(tem) < 4:
                tem = "0" + tem
            else:
                break
        res.append(tem)
    return ''.join(res)

################################START################################################


reg = rand64()

# reg = encode('abcdefgh')  # 寄存器值
X = reg[:19]
Y = reg[19:41]
Z = reg[41:64]

M = encode(input('请输入明文:'))


# print("明文2进制:" + M)
Key = ""   # 密钥流
C = ""  # 密文二进制
L = len(M)  # 明文二进制长度
for i in range(L):
    m = int(mag(int(X[8]), int(Y[10]), int(Z[10])))  # m
    if int(X[8]) == m:
        t = str(int(X[13]) ^ int(X[16]) ^ int(X[17]) ^ int(X[18]))
        X = turn(X, t)
    if int(Y[10]) == m:
        t = str(int(Y[20]) ^ int(Y[21]))
        Y = turn(Y, t)
    if int(Z[10]) == m:
        t = str(int(Z[7]) ^ int(Z[20]) ^ int(Z[21]) ^ int(Z[22]))
        Z = turn(Z, t)

    Key = Key + str(int(X[18]) ^ int(Y[21]) ^ int(Z[22]))  # 密钥
    C = C + str(int(M[i]) ^ int(Key[i]))
print("-------二进制传输----------")
print("2进制密钥:" + Key)
print("2进制密文:" + C)
print("-------十六进制传输--------")
print("16进制密钥:" + bin_hex(Key))
print("16进制密文:" + bin_hex(C))
  • 接收方Alice_send.py
# Bob_accept.py
# 16进制到2进制
def hex_bin(s):
    res = []
    for c in s:
        tem = bin(int(c, 16)).replace('0b', '')
        while True:
            if len(tem) < 4:
                tem = "0" + tem
            else:
                break
        res.append(tem)
    return ''.join(res)


# 2进制变成字符
def decode(s):
    return ''.join([chr(e) for e in [int(b, 2) for b in [s[8 * j: 8 * (j + 1)] for j in range(int(len(s) / 8))]]])


Key = hex_bin(input("请输入16进制密钥:")) # 密钥
C = hex_bin(input("请输入16进制密文:"))
M = ""
for i in range(len(Key)):
    M = M + str(int(C[i]) ^ int(Key[i]))
print("明文:", decode(M))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值