import math classAffineCipher: def__init__(self, a, b): if math.gcd(a,26) != 1: raise ValueError("a必须与26互质") self.a = a self.b = b self.a_inv=pow(a,-1,26)#计算a的逆元
defencrypt(self, text): result = "" for ch in text.upper(): if ch.isalpha(): x = ord(ch) - ord('A') y = (self.a * x + self.b) % 26 result += chr(y + ord('A')) else: result += ch return result
defdecrypt(self, text): result = "" for ch in text.upper(): if ch.isalpha(): y = ord(ch) - ord('A') x = (self.a_inv * (y - self.b)) % 26 result += chr(x + ord('A')) else: result += ch return result
# 加密 defencrypt(text, key): n = len(key) # 密钥矩阵大小,即矩阵阶数 text = text.upper().replace(' ', '') #将空格删除
# 明文分组中每组元素个数必须等于密钥矩阵列数n,故填充X使明文长度为n的倍数 whilelen(text) % n != 0: text += 'X'
result = "" for i inrange(0, len(text), n): #步长为n,开始循环 # 取出n个字母转成数字向量 vec = np.array([[c2n(ch)] for ch in text[i:i + n]]) # 加密:密钥×向量 mod 26 enc = np.dot(key, vec) % 26 # 转回字母 result += ''.join(n2c(int(x)) for x in enc.flatten())#将[[x], [y]]转回成[x, y]
result = "" for i inrange(0, len(text), n): vec = np.array([[c2n(ch)] for ch in text[i:i + n]]) dec = np.dot(inv_key, vec) % 26 result += ''.join(n2c(int(x)) for x in dec.flatten())