仿射变换原理 + python代码

仿射变换原理 + 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)a1 (cb) (mod 26)

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

a − 1 a^{-1} a1表示a的逆元,满足 a − 1 ⋅ a ≡ 1   m o d   26 a^{-1} \cdot a \equiv 1\ mod\ 26 a1a1 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

  • 15
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qinquanquan_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值