密码学之仿射密码

仿射密码

加密过程:
C = E ( m ) = ( k 1 ∗ m + k 2 ) m o d n C = E(m) = (k1 * m + k2) mod n C=E(m)=(k1m+k2)modn
解密过程:
m = D ( C ) = ( ( C − k 2 ) ∗ ( k 1 的逆 ) ) m o d n m = D(C) = ((C - k2) * (k1的逆)) mod n m=D(C)=((Ck2)(k1的逆))modn
其中:

  • C 是加密后的密文。
  • m 是待加密的明文。
  • k1 和 k2 是仿射密码的两个密钥,它们都是0到n-1之间的整数。
  • n 是字母系统的数量,例如对于英文字母系统,n = 26。
  • k1的逆 是k1在模n乘法群中的逆元,即存在一个整数k3,使得 (k3 * k1) mod n = 1。

仿射密码的加密和解密过程都依赖于模n运算,以确保结果始终在0到n-1的范围内。另外,为了保证解密过程能够成功进行,k1和n必须互质(即它们的最大公约数为1)。

import math
# 定义
c = ''        #加密后的字符串
m = ''        #解密后的字符串
word = ''     #输入的字符串
n = ''        #模
k1, k2 = 0, 0 #两个密钥
if __name__ == '__main__':
    k1, k2 = int(input("请输入密钥k1: ")), int(input("请输入密钥k2: "))
    n = int(input("请输入模:"))
    word = input("请输入加解密的字符串:")

    def encode():#加密
        global k1, k2, c, word
        if math.gcd(n, k1) == 1:
            for i in word:
                c += chr(((k1 * (ord(i) - 97) + k2) % n) + 97)
            print("加密为:", c)
            return 0
        else:
            print("加密失败k1与26不互素!")
            return 0
    while (encode()):
        k1 = int(input("请输入密钥k1: "))
        k2 = int(input("请输入密钥k2: "))
    def niyuan():#逆元
        k3 = 1
        while (k1 * k3) % 26 != 1:
            k3 += 1
        return k3
    def decode():#解密
        global m, k2, n, word
        ni = niyuan()
        if ni != 0:
            for i in c:
                m += chr(ni * (ord(i) - 97 - k2) % n + 97)
            print("解密为:", m)
            return 0
        else:
            print("解密失败k1与n没有逆元!")
            return 0
    while (decode()):
        k1 = int(input("请输入密钥k1: "))
        k0 = int(input("请输入密钥k2: "))

你可能感兴趣的:(密码学,python)