仿射密码加解密 python

本文介绍了使用Python实现仿射密码的加解密过程,包括选取模数n、密钥k的生成,以及逆元的计算。通过用户输入的k1、k2和n,利用改进的欧几里得算法求解逆元,并实现加密和解密功能。用户可以输入明文或密文进行操作。
摘要由CSDN通过智能技术生成

参数选取:模数n=26+10=36,k2为学号后2位;k1为与学号后2位最近的素数。

加解密:加密自己名字的全拼,再解密。

密钥 k = (k1 , k2)

仿射密码加解密算法是:    m:是输入的明文 

     C= Ek(m)=(k1m+k2) mod n
     M= Dk(c)=k3(c- k2) mod n   (其中(k3 ×k1)mod26 = 1,即k3是k1的逆元)

求取逆元的过程代码如下:

def get_gcd(a, b):
    k = a // b
    remainder = a % b
    while remainder != 0:
        a = b
        b = remainder
        k = a // b
        remainder = a % b
    return b
    
#改进欧几里得算法求线性方程的x与y
def get_(a, b):
    if b == 0:
        return 1, 0
    else:
        k = a // b
        remainder = a % b        
        x1, y1 = get_(b, remainder)
        x, y = y1, x1 - k * y1            
    return x, y
    
a &

改进后的仿射变换加密(Affine Cipher)是一种简单的替换式密码技术,常用于教学中作为密码学入门示例。Python中实现这种加密可以分为两个部分:加密和解密。 **加密步骤**: 1. 首先,选择两个数字,a和b(通常a和b都是整数),作为密钥。a通常被限制为模26的余数(因为字母表有26个字符)。 2. 对每个输入字符(小写字母)应用映射规则,计算 (char - 'a') * a + b 的结果,然后取模26。如果结果小于0或大于等于26,加上或减去26确保结果在字母范围内。 3. 将得到的结果转换回字符,并存储为加密后的文本。 **解密步骤**: 1. 使用相同的a和b值反向操作。对于加密字符,计算 (encrypted_char - b) * (a^(-1)) % 26,这里'a^(-1)'表示a的逆元(满足aa^(-1) mod 26 = 1)。 2. 将计算出的结果加上'a',再转换回原来的字母。 ```python def encrypt(plaintext, key_a, key_b): encrypted_text = "" for char in plaintext: if char.islower(): num = ord(char) - ord('a') encrypted_num = (num * key_a + key_b) % 26 encrypted_text += chr((encrypted_num + ord('a'))) else: encrypted_text += char return encrypted_text def decrypt(ciphertext, key_a, key_b): plaintext = "" for char in ciphertext: if char.islower(): num = ord(char) - ord('a') decrypted_num = (num * pow(key_a, -1, 26) - key_b) % 26 plaintext += chr((decrypted_num + ord('a'))) else: plaintext += char return plaintext # 示例 key_a = 5 key_b = 7 plaintext = "hello" ciphertext = encrypt(plaintext, key_a, key_b) print(f"Original text: {plaintext}") print(f"Ciphered text: {ciphertext}") decrypted_text = decrypt(ciphertext, key_a, key_b) print(f"Decrypted text: {decrypted_text}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值