Python实现简单的密码设计(基于古典密码)

想了一下,还是发出来吧。这是我们这学期的第一次密码学作业,要求用古典密码组合出一个加密算法,如果这对你来说也是作业,请记得修改。

# 置换密码加密
def shift_encrypt(m, key):
    l = len(key)
    c = ""
    for i in range(0, len(m), l):
        tmp_c = [""] * l
        if i+l > len(m):
            tmp_m = m[i:]
        else:
            tmp_m = m[i:i+l]
        for j in range(len(tmp_m)):
            tmp_c[int(key[j]) - 1] = tmp_m[j]
        c += "".join(tmp_c)
    return c

# 置换密码解密
def shift_decrypt(c, key):
    l = len(key)
    m = ""
    for i in range(0, len(c), l):
        tmp_m = [""] * l
        if i+l >= len(c):
            tmp_c = c[i:]
            re_key = []
            for j in range(len(tmp_c)):
                re_key.append(int(key[j])-1)
            re_key.sort()
            for j in range(len(tmp_c)):
                tmp_m[j] = tmp_c[re_key.index(int(key[j])-1)]
        else:
            tmp_c = c[i:i+l]
            for j in range(len(tmp_c)):
                tmp_m[j] = tmp_c[int(key[j]) - 1]
        m += "".join(tmp_m)
    return m

# 仿射密码加密
def affine_encrypt(m, key):
    tmp = []
    c = ''
    for i in m:
        # 将字符转为ASCII码然后进行仿射加密,加密结果再mod26
        i = ((ord(i)-97)*key[0] + key[1]) % 26
        j = chr(i+97)       # 再将ASCII码转回字符
        tmp.append(j)
    for i in tmp:
        c = c + i
    return c

# 仿射密码解密
def ex_gcd(a, b, arr): # 扩展欧几里得求公约数
    if b == 0:
        arr[0] = 1
        arr[1] = 0
        return a
    g = ex_gcd(b, a%b, arr)
    t = arr[0]
    arr[0] = arr[1]
    arr[1] = t - int(a/b) * arr[1]
    return g
def mod_reverse(a, n): # ax=1(mod n) 求a模n的乘法逆x
    arr = [0,1]
    gcd = ex_gcd(a,n,arr)
    if gcd == 1:
        return (arr[0] % n + n) % n
    else:
        return -1
def affine_decrypt(c, key):
    tmp = []
    m = ''
    inverse = mod_reverse(key[0], 26)   # 逆元
    for i in c:
        i = (inverse * ((ord(i)-97)-key[1])) % 26
        j = chr(i+97)
        tmp.append(j)
    for i in tmp:
        m = m + i
    return m


# 最终加密
m = input("请输入待加密的字符串:")
key1 = '3142'       # 置换密码的密钥   ABCD ---> BDAC
key2 = [11,5]       # 仿射密码的密钥
c1 = shift_encrypt(m, key1)
c2 = shift_encrypt(c1, key1)
c3 = affine_encrypt(c2, key2)
print("加密结果为:", c3)

# 最终解密
c = input("请输入待解密的字符串:")
m1 = affine_decrypt(c, key2)
m2 = shift_decrypt(m1, key1)
m3 = shift_decrypt(m2, key1)
print("解密结果为:", m3)

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值