密码学—仿射密码Python程序

仿射密码

古典密码,且属于单表加密。

加密算法

  • 仿射密码公式
    c = m×k + b mod 26

    • c是密文,m是明文,m作为26字母中的明文,因此计算出来的密文要模26
    • 仿射密码是对单个字母加密,因此加密文本的时候会采用循环加密
  • k
    k在放射密码中作为乘数

    • k要与b要互素
    • 因为k要做乘数,所以必须要和26互素,否则加密失败
  • b
    b在放射密码中作为加数

    • b要与k互素
key_k = 9
key_b = 7
cipher = [] #存放对应的密文数字
p = 26 
mess = 'abc'
for ch in mess:  # 首先将所有信息转化为大写字母, 非字母的不进入存储
    if ord('A') <= ord(ch) <= ord('Z') \
    or ord('a') <= ord(ch) <= ord('z'):
        temp_num = ((ord(ch.upper()) - ord('A')) * key_k + key_b) % p
        cipher.append(temp_num)
print(cipher)
mess = ''
#将转化出来的密文数字转为加密后的密文字母并打印出来
for i in cipher:
    mess+=chr(i+ord('A'))
print(mess) 

解密算法


x = 0
y = 0

#计算模运算
def ext_gcd(a, b):
    global x
    global y
    if (b == 0):
        x = 1
        y = 0
        return a
    res = ext_gcd(b, a % b)
    x1 = x
    x = y
    y = x1 - a // b * y
    return res

    # //线性方程 ax + by = m,当m是gcd(a.b)的倍数时有解

#求解线性方程解
def linearEquation(a, b, m):
    global x
    global y
    d = ext_gcd(a, b)
    if (m % d != 0):
        print("无解")
        return
    else:
        n = m // d
        x *= n;
        y *= n;

    return x, y
  • 仿射密码解密全过程
    (这里用到了上面两个函数,记得拷贝上面的代码再用下面的)


key_k = 9
key_b = 7
cipher = 'HQZ'
p = 26
deCipher = []
temp = 0
dit = linearEquation(key_k, p, math.gcd(key_k, p))
key_k_1 = dit[0]
print('k的逆:', key_k_1)
for ch in cipher:
    if ord('A') <= ord(ch) <= ord('Z') \
    or ord('a') <= ord(ch) <= ord('z'):
        temp = ((ord(ch.upper()) - ord('A') - key_b) * key_k_1) % p
        deCipher.append(temp)
message = ''
# 输出
for i in deCipher:
    message += chr(i + ord('A'))
print(message)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹等寒

谢过道友支持,在下就却之不恭了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值