仿射变换原理 + python代码
仿射变换加解密公式
c = E a , b ( m ) ≡ a m + b ( m o d 26 ) c = E_a,_b(m) \equiv am + b\ (mod \ 26) c=Ea,b(m)≡am+b (mod 26)
m = D a , b ( c ) ≡ a − 1 ( c − b ) ( m o d 26 ) m = D_a,_b(c) \equiv a^{-1}\ (c - b)\ (mod \ 26) m=Da,b(c)≡a−1 (c−b) (mod 26)
其中a, b 为密钥,且满足 0 ≤ a 0 \le a 0≤a, b ≤ 25 b \le 25 b≤25 ,gcd(a, 26) = 1.
a − 1 a^{-1} a−1表示a的逆元,满足 a − 1 ⋅ a ≡ 1 m o d 26 a^{-1} \cdot a \equiv 1\ mod\ 26 a−1⋅a≡1 mod 26 .
仿射变换加密函数
def Affine_Transformation_Encrypt(Message_test, First_Key, Second_Key):
# 输入参数分别为明文消息,第一个加密参数以及第二个加密参数
result = ""
for i in range(len(Message_test)): # 遍历明文消息
char = Message_test[i]
# 区分消息大小写并进行仿射函数加密转换
if char.isupper():
# 大写的转换
result += chr((First_Key * (ord(char) - ord('A')) + Second_Key) % 26 + ord('A'))
# 即 (First_Key*m+Second_Key)%26
else:
# 小写的转换
result += chr((First_Key * (ord(char) - ord('a')) + Second_Key) % 26 + ord('a'))
return result
在python中,ord( )函数返回一个表示特定字符的Unicode字符的整数。这个函数接受一个字符串参数(长度为1),并返回其Unicode码点。
# 例如:
print(ord('a')) # 输出: 97
print(ord('A')) # 输出: 65
print(ord('1')) # 输出: 49
print(ord('@')) # 输出: 64
这些数字是字符在Unicode标准中的位置。
仿射变换解密函数
def Affine_Transformation_Decrypt(Cipher_test, First_Key, Second_Key):
# 输入参数与加密算法相同
result = ""
# result = pow(x, y, z) 表示x的y次幂除以z的余数
First_Key_inv = pow(First_Key, -1, 26)
for i in range(len(Cipher_test)): # 遍历密文消息
char = Cipher_test[i]
# 区分消息大小写并进行仿射函数加密转换
if char.isupper():
result += chr((First_Key_inv * (ord(char) - ord('A') - Second_Key)) % 26 + ord('A'))
# 即 ((First_Key^-1)*(c-Second_Key)%26)
else:
result += chr((First_Key_inv * (ord(char) - ord('a') - Second_Key)) % 26 + ord('a'))
return result
实验测试
这里的实验测试需要提前在py文件的同级目录下,创建 Message_test.txt, Affine_Encrypted.txt, Affine_Decrypted.txt.
在明文文件中提前写好要加密的内容,执行代码后,再打开加解密文件,就会看到加密数据和解密数据了。
这里的密钥分别设置为a = 5, b = 8. 可以根据需要自行更改。
加密文件
with open('Message_test.txt', 'r') as file:
Message_test = file.read()
encrypted_Message_test = Affine_Transformation_Encrypt(Message_test, 5, 8)
with open('Affine_Encrypted.txt', 'w') as file:
file.write(encrypted_Message_test)
解密文件
with open('Affine_Encrypted.txt', 'r') as file:
Cipher_test = file.read()
decrypted_Cipher_test = Affine_Transformation_Decrypt(Cipher_test, 5, 8)
with open('Affine_Decrypted.txt', 'w') as file:
file.write(decrypted_Cipher_test)
实验结果
这里不做展示了,结果会出现在存放加解密数据的.txt文件中。
个人博客地址:qinquanquan.com