仿射变换加解密公式

其中a, b 为密钥,且满足 $0 \le a$, $b \le 25$ ,gcd(a, 26) = 1.

$a^{-1}$表示a的逆元,满足$a^{-1} \cdot a \equiv 1\ mod\ 26$ .

仿射变换加密函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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码点。

1
2
3
4
5
# 例如:
print(ord('a')) # 输出: 97
print(ord('A')) # 输出: 65
print(ord('1')) # 输出: 49
print(ord('@')) # 输出: 64

这些数字是字符在Unicode标准中的位置。

仿射变换解密函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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. 可以根据需要自行更改。

加密文件

1
2
3
4
5
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)

解密文件

1
2
3
4
5
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文件中。