算法分析

  1. 仿射密码结合了移位密码和乘数密码的特点,是移位密码和乘数密码的组合。
  2. 仿射密码的加密算法就是一个线性变化,即对明文字符x,对应的密文字符为y=ax+b(mod26) 其中,a, b属于Z26且gcd(a,b)=1
  3. 实现过程:
  • 选取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-M2C1-C2便可以确定a。因为

C1 = aM1 + b(mod26)
C2 = a
M2 + b(mod26)
易得,a = (C1 – C2)/(M1 – M2) (mod26)

得到a 后,进一步找到b就很容易了。

仿射密码Python实现的更多相关文章

  1. 使用Python解密仿射密码

    新学期有一门密码学课,课上老师布置了一道密码学题,题目如下: 解密由仿射密码加密的密文“DBUHU SPANO SMPUS STMIU SBAKN OSMPU SS” 想解密这个密文,首先必须要知道仿 ...

  2. 仿射密码-fanfie--affine

    仿射密码 仿射密码 是一种专情密码,一对一替换 ~~ 加密函数是 e(x) = ax + b (mod m) 其中a和m 互质,m是字母的数目. 解码函数是 d(x) = a^-1(x - b) (m ...

  3. nyoj 仿射密码

    仿射密码 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 仿射密码是替换密码的另一个特例,可以看做是移位密码和乘数密码的结合.其加密变换如下: E(m)=(k1*m+k2) ...

  4. 安全篇:弱密码python检测工具

    安全篇:弱密码python检测工具 https://github.com/penoxcn/PyWeakPwdAudit

  5. NYOJ-770仿射密码,乘数密码与移位密码的结合;

    仿射密码 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 ->   Link   <- 和乘数密码差不多: 加密算法:Ek(m)=(k1*m+k2)%q;gcd(k ...

  6. 猪圈密码python脚本实现

    CTF比赛中,MISC题型中有时候会考到一种一种叫做"猪圈密码"(Pigpen_chiper)的简单加密方式.网上有个表可以对照地来实现解密,但是实际中太慢不符合竞速思维,于是写一 ...

  7. 破解栅栏密码python脚本

    今天遇到一个要破解的栅栏密码,写了个通用的脚本 #!/usr/bin/env python # -*- coding: gbk -*- # -*- coding: utf_8 -*- # Author ...

  8. NYOJ题目770仿射密码

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAs4AAAIUCAIAAACFKz0yAAAgAElEQVR4nO3dPXLruLaG4TsJ5RqIYw

  9. 分享一个撩妹、装13神技能,0基础用Python暴力破解WiFi密码

    WiFi密码Python暴力破解   Python密码破解部分截图 获取视频资料,转发此文+点击喜欢,然后获取资料请加Python交流群:580478401,就可以获取视频教程+源码 环境准备: py ...

随机推荐

  1. python装饰器的参数传递

    被装饰器装饰的函数名即使没有被调用(因为有@xxx,会触发运行装饰器),(装饰器工厂函数)定义装饰器的代码已经运行了(最内部的那个函数并没有运行)(把被装饰的原函数引用赋值给了装饰器内部的那个函数名) ...

  2. pandas在指定列插入数据

    import pandas as pd import numpy as np df = pd.DataFrame(np.arange(15).reshape(5, 3), columns=['a', ...

  3. python实现图书管理系统

    # 用户注册 def logon(): print("欢迎来到图书管理系统注册页面~") username = input("请输入用户名:") if len( ...

  4. 决策树分类回归,ID3,c4.5,CART,及其Python代码

    决策树模型 内部节点表示一个特征或者属性,叶子结点表示一个类.决策树工作时,从根节点开始,对实例的每个特征进行测试,根据测试结果,将实例分配到其子节点中,这时的每一个子节点对应着特征的一个取值,如此递 ...

  5. xls文件转化txt

    xls文件转化txt # -*- coding:utf-8 -*- # 安装pywin32包 http://sourceforge.net/projects/pywin32/files/pywin32 ...

  6. You are attempting to install the android sdk inside your android studio installation

    原因 我的android studio文件名为AndroidStudio 我的android studio sdk文件名为AndroidStudioSDK 所以系统把AndroidStudioSDK自 ...

  7. 4)PHP命名规则,传值方式

    (1)命名规则: 包括变量名,类名,接口名函数名等等 ①基本规则: 只能使用小写字母,下划线或者数字 数字不能开头 不能跟环境和系统关键字重复(比如,if,else,function) ② 驼峰式   ...

  8. msgfmt - 翻译汉化

    说明 目前大部分自由软件实现国际化使用的是gettext. 国际化就是让程序可以使用多国语言来显示程序里的字符串. 程序里一般都有很多字符串,菜单名也好,错误信息也好,都是字符串.假设字符串为stri ...

  9. Python运维中常用的_脚本

    前言 file是一个类,使用file('file_name', 'r+')这种方式打开文件,返回一个file对象,以写模式打开文件不存在则会被创建.但是更推荐使用内置函数open()来打开一个文件. ...

  10. 二十八、rsync同步工具深入

    1.将rsync服务加入到自启动文件rc.local echo "/usr/bin/rsync --daemon" >>/etc/rc.local tail -l rc ...