仿射加密
最简单的加密方式之一。
令 P = C = K = Z 26 P=C=K=\textbf{Z}_{26} P=C=K=Z26对 0 ≤ K ≤ 25 0\le K\le 25 0≤K≤25任意 x , y ∈ Z 26 x,y\in \textbf{Z}_{26} x,y∈Z26定义 e ( x ) = ( a x + b ) m o d 26 e(x)=(ax+b)\mod 26 e(x)=(ax+b)mod26、定义 d ( y ) = a − 1 ( y − b ) m o d 26 d(y)=a^{-1}(y-b)\mod 26 d(y)=a−1(y−b)mod26,其中 a − 1 a^{-1} a−1为 a a a在 Z 26 \textbf{Z}_{26} Z26上的乘法逆。对任意的 x ∈ Z 26 x\in \textbf{Z}_{26} x∈Z26有 d K ( e ( x ) ) = x d_K(e(x))=x dK(e(x))=x。 a a a必需和 26 26 26互质。
代码
python3
输入b和a值之后输入待加密字符串敲回车即可看到加密和解密结果。待加密字符串不区分大小写。b如果不与26互质则需要重输。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
START = ord('a')
CHAR_COUNT = 26
print('input \'b\':')
OFFSET = int(input()) % CHAR_COUNT
def gcd(m, n):
return max(abs(n), abs(m)) if n*m == 0 else gcd(abs(n), abs(m) % abs(n))
def set_factor(v):
return set_factor(int(input()) % CHAR_COUNT) if gcd(v, CHAR_COUNT) != 1 else v
print('input \'a\':')
FACTOR = set_factor(int(input()) % CHAR_COUNT)
print('input str:')
MAP = {
chr(v+START-1): chr(((FACTOR*v+OFFSET) % CHAR_COUNT)+START) for v in range(1, CHAR_COUNT+1)}
def encrypt(str): # 加密
return ''.join([MAP[char] if char in MAP else char for char in str.lower()])
def decrypt(str): # 解密
return ''.join([list(MAP.keys())[list(MAP.values()).index(char)] if char in MAP.values() else char for char in str.lower()])
v = input()
print('\033[31m', 'encrypt: ', encrypt(v), '\033[0m', '\033[35m', '\t decrypt: ', decrypt(encrypt(v)), '\033[0m')
运行结果
input 'b':
3
input 'a':
14
15
input str:
abcdefghijklmnopqrstuvwxyz
encrypt: shwlapetixmbqfujyncrgvkzod decrypt: abcdefghijklmnopqrstuvwxyz