仿射密码(Affine)

简介: 仿射密码(Affine)

仿射密码(Affine)

  • 加密对象: 英文字母
  • 原理:
  • 该密码运用了乘法
  • 逆元和模运算
  • a~z对应于0~25, 将明文的每个字符转为对应的数字
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  • 加密函数:D(x) = (a*x+b) (mod 26),这里a,b变量就是密钥,注意 a必须和26互质
  • 通过加密函数得到密文的数字,在查表,组合在一起就构成了密文。
  • 解密过程与加密
  • 类似
  • 解密函数: E(x) = a-1(x-b) (mod 26), 这里a-1是a关于26的乘法逆元。
  • 代码:
# write by 2021/6/28
DIC = "abcdefghijklmnopqrstuvwxyz"
# 辗转相除法
def gcd(a, b):
    a, b = b, a % b
    # print(a, b)
    if b == 0:
        return a
    else:
        return gcd(a, b)
# 扩展欧几里得算法
def exgcd(a, b):
    if b == 0:
        return 1, 0
    x, y = exgcd(b, a % b)
    return y, x-(a//b)*y
def encrypt_affine(string, a, b):
    ciphertext = ""
    if gcd(a, 26) != 1 and gcd(a, 26) != -1:
        return -1
    for i in string.lower():
        if i not in DIC:
            ciphertext += i
        else:
            ciphertext += DIC[(a*DIC.index(i)+b) % 26]
    return ciphertext
# 直接遍历所有26可能,找到为止
def decrypt2_affine(string, a, b):
    plaintext = ""
    if gcd(a, 26) != 1 and gcd(a, 26) != -1:
        return -1
    for i in string.lower():
        if i not in DIC:
            plaintext += i
        # (x*7+3)%26 = 4
        else:
            for x in range(26):
                if (x*a + b) % 26 == DIC.index(i):
                    # print("x=", x)
                    plaintext += DIC[x]
                    break
    return plaintext
# 根据扩展欧几里得算法找到乘法逆元,在求解
def decrypt_affine(string, a, b):
    plaintext = ""
    if gcd(a, 26) != 1 and gcd(a, 26) != -1:
        return -1
    a_26_inv = exgcd(a, 26)[0]
    for i in string:
        if i not in DIC:
            return -1
        plaintext += DIC[a_26_inv*(DIC.index(i)-b) % 26]
    return plaintext
if __name__ == '__main__':
    # print(exgcd(3, 26))
    a, b = 2, 21
    ciphertext_ = encrypt_affine("AFFINECIPHER", a, b)
    plaintext_ = decrypt_affine(ciphertext_, a, b)
    plaintext_2 = decrypt2_affine(ciphertext_, a, b)
    print(f"{plaintext_}: {ciphertext_}")
    print(f"{plaintext_2}: {ciphertext_}")
目录
相关文章
|
NoSQL Java 数据库连接
SpringBoot-搭建Mybatis项目
通过本文的学习,读者将了解如何使用IntelliJ IDEA快速搭建一个基于SpringBoot和Mybatis的Java Web应用程序,提高开发效率。
591 0
|
Cloud Native Docker 容器
云原生之使用Docker部署Affine知识库工具
云原生之使用Docker部署Affine知识库工具
2603 0
|
消息中间件 存储 数据库
深入学习RocketMQ的底层存储设计原理
文章深入探讨了RocketMQ的底层存储设计原理,分析了其如何通过将数据和索引映射到内存、异步刷新磁盘以及消息内容的混合存储来实现高性能的读写操作,从而保证了RocketMQ作为一款低延迟消息队列的读写性能。
|
存储 安全 数据安全/隐私保护
Notion平替工具AFFINE知识库如何本地部署与公网远程访问
Notion平替工具AFFINE知识库如何本地部署与公网远程访问
607 1
|
6月前
|
存储 人工智能 Cloud Native
“爆款”批量生成,如何实现一键创作 AI 有声绘本?
“爆款”批量生成,如何实现一键创作 AI 有声绘本?
154 0
|
9月前
|
存储 人工智能 人机交互
PC Agent:开源 AI 电脑智能体,自动收集人机交互数据,模拟认知过程实现办公自动化
PC Agent 是上海交通大学与 GAIR 实验室联合推出的智能 AI 系统,能够模拟人类认知过程,自动化执行复杂的数字任务,如组织研究材料、起草报告等,展现了卓越的数据效率和实际应用潜力。
1076 1
PC Agent:开源 AI 电脑智能体,自动收集人机交互数据,模拟认知过程实现办公自动化
|
11月前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
259 2
|
存储 安全 Java
全面探索Spring框架中的事件处理机制
在现代应用程序中,各个组件之间的通信是至关重要的。想象一下,你的应用程序中的各个模块像是一个巨大的交响乐团,每个模块都是一位音乐家,而Spring事件机制就像是指挥家,将所有音乐家协调得天衣无缝。这种松耦合的通信方式使你的应用程序更加灵活、可维护,而且能够轻松应对变化。现在,让我们进入这个令人兴奋的音乐厅,探索Spring事件的世界。
|
Java
深入理解 Java 异步编程:Future 和 CompletableFuture 的全面比较
深入理解 Java 异步编程:Future 和 CompletableFuture 的全面比较
599 0
|
安全 算法 网络协议
HTTPS协议的详细讲解(四次握手)
HTTPS协议的详细讲解(四次握手)