仿射密码Python实现
算法分析
- 仿射密码结合了移位密码和乘数密码的特点,是移位密码和乘数密码的组合。
- 仿射密码的加密算法就是一个线性变化,即对明文字符x,对应的密文字符为y=ax+b(mod26)其中,a, b属于Z26且gcd(a,b)=1
- 实现过程:
- 选取a,b两个参数,其中gcd(a, 26)=1
- 加密变换: c= a∗+b 26
 a=1时,移位密码
 b=1时,乘数密码
- 解密变换:  = (c−b)∗a^(−1) 26
算法实现
# 暴力破解
la = [1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]
lb = [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]
# 最大公约数
def gcd(a, b):
    while b != 0:
        tem = a % b
        a = b
        b = tem
    return a
# 加密
def encrypt(m, c, a, b):
    for i in range(len(m)):
        # 加密成相应的大写字母
        c.append(chr(((ord(m[i]) - 97) * a + b) % 26 + 65))
    d = ''.join(c)
    print(d)
# 求逆元
def niyuan(a, b):
    ny = 1
    while (a * ny) % b != 1:
        ny += 1
    return ny
# 解密
def decrypt(c, k, b):
    mw = []
    for i in range(len(c)):
        tem = ord(c[i]) - 65 - b
        if tem < 0:
            tem += 26
        mw.append(chr((k * tem) % 26 + 97))
    print("k=" + str(k) + ", b=" + str(b) + "时,解密后的明文为:")
    res = ''.join(mw)
    print(res)
#实现
if __name__ == "__main__":
    # 明文
    m = 'ifnottothesunforsmilingwarmisstillinthesuntherebutwewilllaughmoreconfidentcalmifturnedtofoundhisownshadowappropriateescapethesunwillbethroughtheheartwarmeachplacebehindthecornerifanoutstretchedpalmcannotfallbutterflythenclenchedwavingarmsgivenpowerificanthavebrightsmileitwillfacetothesunshineandsunshinesmiletogetherinfullbloom'
    # 密文
    c = []
    x, y = input("请输入a和b: ").split()
    a = int(x)
    b = int(y)
    while gcd(a, b) != 1:
        x, y = input("a和b不互素,请重新输入a和b: ").split()
        a = int(x)
        b = int(y)
    print("明文内容为:")
    print(m)
    print("加密后的密文为:")
    encrypt(m, c, a, b)
    print("知道密钥破解:")
    k = niyuan(a, 26)
    decrypt(c, k, b)
    print("不知道秘钥破解,暴力破解如下: ")
    for i in range(0, 12):
        for j in range(0, 26):
            decrypt(c, la[i], lb[j])
加密与解密
- 加密:输入a = 3, b = 4时,加密结果如图所示:
  
- 解密:知道秘钥k = 9, b = 4(k为a的逆元)时,解出相应明文。
  
正确性
由于算法的前提要求gcd(a,26)==1, 从而使加密函数c= a∗+b 26是一个单射函数,故其解必然是唯一的。即,gcd(a,26)==1保证了仿射加密函数是一个双射函数,故算法正确。
安全性分析
- 此密码算法安全性较弱。由算法的实现可知,此算法的秘钥空间大小为12*26 – 1 ==311(去除a = 1, b = 0时的情况)且a = 1,3,5,7,9,11,15,17,19,21,23,25故很容易便能够通过暴力破解获得明文。
  
- 还可以通过统计分析破解:代码如下
#统计破解仿射密码
# 最大公约数
def gcd(a, b)
    while b != 0:
        tem = a % b
        a = b
        b = tem
    return a
if __name__ == "__main__":
    # a = 3, b = 4时的密文
    m = "CTRUJJUJZQGMRTUDGOCLCRWSEDOCGGJCLLCRJZQGMRJZQDQHMJSQSCLLLEMWZOUDQKURTCNQRJKELOCTJMDRQNJUTUMRNZCGUSRGZENUSEXXDUXDCEJQQGKEXQJZQGMRSCLLHQJZDUMWZJZQZQEDJSEDOQEKZXLEKQHQZCRNJZQKUDRQDCTERUMJGJDQJKZQNXELOKERRUJTELLHMJJQDTLYJZQRKLQRKZQNSEPCRWEDOGWCPQRXUSQDCTCKERJZEPQHDCWZJGOCLQCJSCLLTEKQJUJZQGMRGZCRQERNGMRGZCRQGOCLQJUWQJZQDCRTMLLHLUUO"
    # 根据统计而得出的实际各字母出现的概率
    reality = dict(a=0.082, b=0.015, c=0.028, d=0.043, e=0.127, f=0.022, g=0.02, h=0.061, i=0.07,
                   j=0.002, k=0.008, l=0.04, m=0.024, n=0.067, o=0.075, p=0.019, q=0.001, r=0.06,
                   s=0.063, t=0.091, u=0.028, v=0.01, w=0.023, x=0.001, y=0.02, z=0.001)
    # 对字典中各字母出现的概率进行降序排序
    order = dict(sorted(reality.items(), key = lambda x:x[1], reverse = True))
    print("统计中各字母出现的概率从小到大如下: ")
    print(order)
    # 统计密文中各字母出现的次数
    example = {}
    for i in m:
      example[i] = m.count(i)
    # 对字典中各字母出现的次数进行降序排序
    result = dict(sorted(example.items(), key = lambda x:x[1], reverse = True))
    print("计算得的密文中个字母的出现的次数从大到小如下: ")
    print(result)
    # #从结果可推测:Q由e加密而得,J由t加密而得,进行验算。
    # (a*4+b)%26==16
    # (a*19+b)%26==9
    # 从而计算出a=3,b=4
    # (a*K)%26==1,求得k=9
    # 用k=9,b=4进行解密可得出明文
    print("根据统计分析,加密所用的a, b可能为:")
    for i in range(1,26):
        for j in range(1,26):
            if (i*4+j)%26==16 and (i*19+j)%26==9:
                if gcd(i, j)==1:
                    print("a="+str(i), "b="+str(j))
运行结果为(此处以破解a=3, b=4时得出的密文):
    
    如图所示,正确解出a, b 再用(a*k)%26==1,求得k=9 用k=9,b=4进行解密可得出明文。
- 还可以通过差分分析进行破解。对于仿射密码来说,“差分”是模26减法,那么,在不知道两对明密文对(M1,C1)(M2, C2)的情况下,只需要知道M1-M2和C1-C2便可以确定a。因为
C1 = aM1 + b(mod26)
C2 = aM2 + b(mod26)
易得,a = (C1 – C2)/(M1 – M2) (mod26)
得到a 后,进一步找到b就很容易了。
仿射密码Python实现的更多相关文章
- 使用Python解密仿射密码
		新学期有一门密码学课,课上老师布置了一道密码学题,题目如下: 解密由仿射密码加密的密文“DBUHU SPANO SMPUS STMIU SBAKN OSMPU SS” 想解密这个密文,首先必须要知道仿 ... 
- 仿射密码-fanfie--affine
		仿射密码 仿射密码 是一种专情密码,一对一替换 ~~ 加密函数是 e(x) = ax + b (mod m) 其中a和m 互质,m是字母的数目. 解码函数是 d(x) = a^-1(x - b) (m ... 
- nyoj  仿射密码
		仿射密码 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 仿射密码是替换密码的另一个特例,可以看做是移位密码和乘数密码的结合.其加密变换如下: E(m)=(k1*m+k2) ... 
- 安全篇:弱密码python检测工具
		安全篇:弱密码python检测工具 https://github.com/penoxcn/PyWeakPwdAudit 
- NYOJ-770仿射密码,乘数密码与移位密码的结合;
		仿射密码 时间限制:1000 ms | 内存限制:65535 KB 难度:1 -> Link <- 和乘数密码差不多: 加密算法:Ek(m)=(k1*m+k2)%q;gcd(k ... 
- 猪圈密码python脚本实现
		CTF比赛中,MISC题型中有时候会考到一种一种叫做"猪圈密码"(Pigpen_chiper)的简单加密方式.网上有个表可以对照地来实现解密,但是实际中太慢不符合竞速思维,于是写一 ... 
- 破解栅栏密码python脚本
		今天遇到一个要破解的栅栏密码,写了个通用的脚本 #!/usr/bin/env python # -*- coding: gbk -*- # -*- coding: utf_8 -*- # Author ... 
- NYOJ题目770仿射密码
		aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAs4AAAIUCAIAAACFKz0yAAAgAElEQVR4nO3dPXLruLaG4TsJ5RqIYw 
- 分享一个撩妹、装13神技能,0基础用Python暴力破解WiFi密码
		WiFi密码Python暴力破解 Python密码破解部分截图 获取视频资料,转发此文+点击喜欢,然后获取资料请加Python交流群:580478401,就可以获取视频教程+源码 环境准备: py ... 
随机推荐
- python base 64
			python中base64编码与解码 引言: 在一些项目中,接口的报文是通过base64加密传输的,所以在进行接口自动化时,需要对所传的参数进行base64编码,对拿到的响应报文进行解码: Bas ... 
- centos7 安装gdb (调试nginx)
			首先卸载原有的gdb,sudo yum remove gdb 从gnu官网下载最新的gdb源文件,wget http://mirrors.ustc.edu.cn/gnu/gdb/gdb-7.9.1.t ... 
- KeyError: 'xxx does not support field: _id'
			Scrapy存储爬取的数据时,提示不支持某些字段 在Item文件中,添加对应的字段即可 
- 数据处理——One-Hot Encoding
			一.One-Hot Encoding One-Hot编码,又称为一位有效编码,主要是采用位状态寄存器来对个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效. 在实 ... 
- JavaScript可以做嵌入式开发了
			JS怎么可能搞嵌入式开发? TESSEL这个工具可直接在设备上运行JS,无需服务端支持. 百闻不如一见,请查看官网介绍吧:http://technical.io/ 网页内还有一个示例,点击会看到LED ... 
- dubbo通信协议对比
			对dubbo的协议的学习,可以知道目前主流RPC通信大概是什么情况,本文参考dubbo官方文档 http://dubbo.io/User+Guide-zh.htm dubbo共支持如下几种通信协议: ... 
- SaltSack 中Job管理
			一.简介 Jid: job id的格式为%Y%m%d%H%M%S%f master在下发指令消息时,会附带上产生的jid,minion在接收到指令开始执行时,会在本地的cachedir(默认是/var ... 
- SAP 配置表记录创建人/创建日期/创建时间/更改人/更改日期/更改时间
			在实际开发需求中,为了使客制功能具有灵活的可配置性,通常采用开发功能+配置表的形式处理.有些客制的配置功能需要追溯到谁在什么时候增加了什么配置,或者谁在什么时候更改了什么位置,配置表的Log功能就显得 ... 
- 47)PHP,数据库多表连接
			https://www.w3cschool.cn/mysql/56ik1sqv.html 
- 一文带你了解BOM基本知识
			1.1. BOM和DOM的区别DOM就是一套操作HTML标签的API(接口/方法/属性) BOM就是一套操作浏览器的API(接口/方法/属性) 1.2. BOM中常见的对象window: 代表整个浏览 ... 
