密码学之仿射密码

仿射密码

加密过程:
C = E ( m ) = ( k 1 ∗ m + k 2 ) m o d n C = E(m) = (k1 * m + k2) mod n C=E(m)=(k1m+k2)modn
解密过程:
m = D ( C ) = ( ( C − k 2 ) ∗ ( k 1 的逆 ) ) m o d n m = D(C) = ((C - k2) * (k1的逆)) mod n m=D(C)=((Ck2)(k1的逆))modn
其中:

  • C 是加密后的密文。
  • m 是待加密的明文。
  • k1 和 k2 是仿射密码的两个密钥,它们都是0到n-1之间的整数。
  • n 是字母系统的数量,例如对于英文字母系统,n = 26。
  • k1的逆 是k1在模n乘法群中的逆元,即存在一个整数k3,使得 (k3 * k1) mod n = 1。

仿射密码的加密和解密过程都依赖于模n运算,以确保结果始终在0到n-1的范围内。另外,为了保证解密过程能够成功进行,k1和n必须互质(即它们的最大公约数为1)。

import math
# 定义
c = ''        #加密后的字符串
m = ''        #解密后的字符串
word = ''     #输入的字符串
n = ''        #模
k1, k2 = 0, 0 #两个密钥
if __name__ == '__main__':
    k1, k2 = int(input("请输入密钥k1: ")), int(input("请输入密钥k2: "))
    n = int(input("请输入模:"))
    word = input("请输入加解密的字符串:")

    def encode():#加密
        global k1, k2, c, word
        if math.gcd(n, k1) == 1:
            for i in word:
                c += chr(((k1 * (ord(i) - 97) + k2) % n) + 97)
            print("加密为:", c)
            return 0
        else:
            print("加密失败k1与26不互素!")
            return 0
    while (encode()):
        k1 = int(input("请输入密钥k1: "))
        k2 = int(input("请输入密钥k2: "))
    def niyuan():#逆元
        k3 = 1
        while (k1 * k3) % 26 != 1:
            k3 += 1
        return k3
    def decode():#解密
        global m, k2, n, word
        ni = niyuan()
        if ni != 0:
            for i in c:
                m += chr(ni * (ord(i) - 97 - k2) % n + 97)
            print("解密为:", m)
            return 0
        else:
            print("解密失败k1与n没有逆元!")
            return 0
    while (decode()):
        k1 = int(input("请输入密钥k1: "))
        k0 = int(input("请输入密钥k2: "))
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经典密码学中的仿射密码是一种替换密码,它使用了一种线性变换的方法对明文进行加密。下面是一个简单的仿射密码的加密和解密的Python代码示例: ```python def affine_encrypt(plain_text, key): encrypted_text = "" for char in plain_text: if char.isalpha(): if char.isupper(): encrypted_text += chr((ord(char) - 65) * key[0] + key[1] % 26 + 65) else: encrypted_text += chr((ord(char) - 97) * key[0] + key[1] % 26 + 97) else: encrypted_text += char return encrypted_text def affine_decrypt(cipher_text, key): decrypted_text = "" for char in cipher_text: if char.isalpha(): if char.isupper(): decrypted_text += chr(((ord(char) - 65 - key[1]) * mod_inverse(key[0], 26)) % 26 + 65) else: decrypted_text += chr(((ord(char) - 97 - key[1]) * mod_inverse(key[0], 26)) % 26 + 97) else: decrypted_text += char return decrypted_text def mod_inverse(a, m): for x in range(1, m): if (a * x) % m == 1: return x return -1 # 示例使用 plain_text = "Hello, World!" key = (5, 8) # 仿射密码的密钥,其中key[0]为乘法因子,key[1]为加法因子 encrypted_text = affine_encrypt(plain_text, key) decrypted_text = affine_decrypt(encrypted_text, key) print("明文:", plain_text) print("加密后:", encrypted_text) print("解密后:", decrypted_text) ``` 请注意,上述代码仅为示例,实际使用中需要考虑更多的安全性和错误处理。另外,仿射密码是一种较为简单的密码算法,现代密码学中已经有更加安全的替代算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值