仿射变换加解密公式
其中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')) 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')) print(ord('A')) print(ord('1')) print(ord('@'))
|
这些数字是字符在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 = "" 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')) 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文件中。
Author:
QUANQUAN
License:
Copyright (c) 2019 CC-BY-NC-4.0 LICENSE
Slogan:
Make the world MORE PERFECT !