Playfair Crack
关于playfair密码的破解。
Playfair这个加密呢,之前做题一直有点困扰我。最近找到了一篇关于playfair crack的文章,就想着自己写一下里面的破解算法。原文给出了C语言实现,这篇相当于是原文的翻译吧。
这是原文地址:
http://www.practicalcryptography.com/cryptanalysis/stochastic-searching/cryptanalysis-playfair/
使用的是Simulated annealing(模拟退火)算法。要求明文长度至少要大于100字符。
//hill-climbing algorithm:
1-生成一个随机的key,作为我们的'parent', 使用这个key对密文进行解密,计算结果的适配度,并保存这个值。
2-微小的改变key,比如随机的交换其中的两个字符。重新进行解密与评估,将评估结果保存。
3-如果修改的密钥适配度要高一些,那么将当前的key作为parent,丢弃之前的parent。
4-回到2, 除非在迭代一千次之后都没有提升。
在简单的单表或者多表替换密码中,我们可以采用爬山算法,每次迭代优化选择我们的key,直到把最优的key选择出来。但是仅仅将这种算法运用与playfair,我们是无法破解他的,爬山算法会进入一个局部最优的情况。所以我们需要让爬山算法偶尔能接收结果下降的改变,也就是我们的SA了。
// Simulated annealing algorithm (hill-climbing enhance):
1-生成一个随机的key,作为我们的'parent', 使用这个key对密文进行解密
2-计算当前密钥解密的出来的数据的适配度,并保存
3-for(TEMP = 10; TEMP >= 0; TEMP -= STEP)for(count = 50000; count > 0; count--)微小的改变key,比如随机的交换其中的两个字符,获得子密钥child。衡量当前子密钥的适配度set dF = (子密钥适配度 - 父密钥适配度)if dF > 0parent = childif dF < 0 parent = child 在e^(dF/T)的概论下// T是退火算法的温度参数
关于公式 e d F T e^{\frac{dF}{T}} eTdF有以下的特点:
变量 | e d F T e^{\frac{dF}{T}} eTdF的值 |
---|---|
d F < < 0 dF <<0 dF<<0 | c l o s e 0 close \quad 0 close0 |
d F c l o s e 0 dF \ close \ 0 dF close 0 | c l o s e 1 close \quad 1 close1 |
l a r g e T large \ T large T | c l o s e 1 close \quad 1 close1 |
s m a l l T small \ T small T | c l o s e 0 close \quad 0 close0 |
我们将 e d F T e^{\frac{dF}{T}} eTdF作为概论判断依据。如果他很接近1的话,我们基本上就等于接受了parent = child
。而如果他很接近0的话,我们也就相当于不改变parent
。而对T的修改也同理的。当T很大的时候,整体的幂次数会接近0,那么其值就接近了1,而T很小的时候,其值就会像负方向移动,更加接近0。随者程序的运行我们会不断的降低这个T,那么我们将越来越低可能的接收适配度降低的子密钥。
我们为什么要这么做?还是为了跳出爬山算法的局部最优。爬山算法进入了局部最优那么我们就无法跳出了,添加这种接收损失的途径可以让我们有可能跳出局部最优,而且在我们尝试的次数足够多的时候,我们基本上都能够跳出原来的局部最优解,从而得到一个适配度更好的结果。当我们的温度T将到0之后,就和爬山算法别无二致了。
测量适配度
其实就是判断当前的明文和英文的拟合程度,也就是像不像是英文文本。一个和英文文本很像的明文将会获得一个高的分数,而杂乱无章的随机字符序列将会得到一个低的分数。这里我们使用quadgram statistics作为我们的分析工具。通过分析当前明文的分布和正常的英语是否接近来给出相应的分数。如果明文中有“QKPC”这种基本上看不到的英文序列,基本上就和英文文本说再见了。所以我们可以通过这种方式来评判一个解密密钥的好坏。
Quadgram Statistics
为了本文逻辑的完整性,我把另外一篇文章的内容也搬过来了
原文地址:http://www.practicalcryptography.com/cryptanalysis/text-characterisation/quadgrams/
我们想要来判断一个明文片段是否和给定的语言种类接近,可以对Quadgram(四格图)进行计数,或者说对4个字母一组进行计数。
当然,single letter frequencies, bigrams 与 trigrams也是可以用来做这个的。但是Quadgram效果最好。在单词ATTACK中,我们的四格图为:ATTA,TTAC,TACK
。
想要用quadgram来判断文本是否和英文接近,我们首先要知道那些quadgram在英文里出现了。要做到这一点,我们需要用大量的文本片段去计算。比如用几本书的内容,统计其中出现的quadgram。然后计算每个quadgram出现的概论。
在《战争与和平》中,统计出了2500000个quadgram。计算出每一个quadgram出现的概率,然后对他做log处理。
Quadgram | Count | Log Probability |
---|---|---|
AAAA | 1 | -6.40018764963 |
QKPC | 0 | -9.40018764963 |
YOUR | 1132 | -3.34634122278 |
TION | 4694 | -2.72864456437 |
ATTA | 359 | -3.84509320105 |
有部分quadgram出现的很频繁,这个quadgram就可以当作我们判断的一个依据。而QKPC这种序列是完全没有出现过,他的可能性是负无穷,表格上并不是,这是因为我们给概率定了一个下界。
为了计算明文碎片整体的可能性,我们需要提取当前明文碎片所有的quadgram,然后将他们的概率相乘。
还是拿ATTACK
举例:
p ( A T T A C K ) = p ( A T T A ) × p ( T T A C ) × p ( T A C K ) p ( A T T A ) = c o u n t ( A T T A ) N p(ATTACK) = p(ATTA) \times p(TTAC) \times p(TACK) \\ p(ATTA) = \frac{count(ATTA)}{N} p(ATTACK)=p(ATTA)×p(TTAC)×p(TACK)p(ATTA)=Ncount(ATTA)
最后将概率进行log操作。
l o g ( p ( A T T A C K ) ) = l o g ( p ( A T T A ) ) + l o g ( p ( T T A C ) ) + l o g ( p ( T A C K ) ) log(p(ATTACK)) = log(p(ATTA)) + log(p(TTAC)) + log(p(TACK)) log(p(ATTACK))=log(p(ATTA))+log(p(TTAC))+log(p(TACK))
具体实现很简单的。如果嫌麻烦,可以去原文下载python实现代码。
算法考量
在破解简单替换加密的时候,简单的对父密钥进行修改,并不能让我们破解playfair加密。通过添加其他的交换方式比如行交换、列交换、逆序、左移右移、反转、上下位移等等(这里主要是playfair的key是一个棋盘格式),我们很有可能能够得到正确的key。
我们需要考虑的是我们新引入的变量:起始温度,温度下降阶,以及每阶中的迭代次数。迭代次数越高,我们能得到正确key的可能性就越大,但是耗时会越久。通过降低温度下降阶(每次下降的温度减小),我们能得到正确的key的可能性就越大,但是耗时会越久。而起始温度一般来说和密文的长度有关系。对于一个100字节长度的密文,起始温度在10附近。而对于300字节长的密文,起始温度在20附近。
使用模拟退火算法破解playfair,可以参考这篇论文:“Breaking Short Playfair Ciphers with the Simulated Annealing Algorithm” by Cowan, M. Cryptologia, Vol 32, issue 1, 2008.
附上一个我修改的过的直接可以用的PlayfairCrack.exe
Playfair Crack相关推荐
- 关于jetbrains系列产品2018.1.5以后的使用(crack)方法
产品请一律官网下载:https://www.jetbrains.com/ 我这里以JetBrains GoLand 2018.2.1为例说明下非付费的使用方法(若资金允许,请点击https://www ...
- Simcenter Flotherm Crack 2020中文版
教程: 1.下载解压,得到源文件和flotherm xt2020文件: 2.打开_SolidSQUAD_文件夹,将ProgramData文件夹和文件夹复制到c盘覆盖: 3.然后以管身份" M ...
- 备忘录:CISCO router ENABLE crack
CISCO router ENABLE crack 思路:修改配置寄存器的值:0X2102改为0X2142,使路由器在启动时绕过startup-config文件,然后重新配置enable密码. 1. ...
- crack app(jeb动态调试)
文章目录 拆包 打包 签名 验证 jeb 查看设备是否连接: 以调试模式启动目标APK 回到JEB中,下断点开始调试. 断点 注意 注意事项: jeb调整字体大小 正常模式启动调试 调试模式启动调试 ...
- 沙老师的作业系列——Crudd‘s Crack Head
沙老师的作业系列--Crudd's Crack Head 附件 看看输入的地方 在IDA里面分析一波, shift+F12, 找到运行成功的字符串的位置 找到位置 反汇编看下代码, 有能力的直接刚汇编 ...
- 文献记录(part35)--Mixed pooling and richer attention feature fusion for crack detection
学习笔记,仅供参考,有错必纠 文章目录 Mixed pooling and richer attention feature fusion for crack detection 摘要 Introdu ...
- 文献记录(part29)--Building crack identification and total quality management method based on deep ...
学习笔记,仅供参考,有错必纠 主要记录实验 文章目录 Building crack identification and total quality management method based o ...
- 08:vigenère密码_密码技术:Vigenére密码,Playfair密码,Hill密码
08:vigenère密码 1)Vigenére密码 (1) Vigenére Cipher) This technique is an example of Polyalphabetic Subst ...
- crack翻译成中文_crack是什么意思_crack在线翻译_英语_读音_用法_例句_海词词典
〈非正〉夸奖; 吹捧 be not as good as other people have praised; praise highly crack up The land cracked up b ...
最新文章
- Zabbix监控之常用snmp-OID
- python webbrowser安装_如何为python webbrows设置BROWSER环境变量
- elasticsearch api中的Delete By Query API操作
- 独眼巨人反应组织了Java 8库的寒武纪爆发
- 成员变量的声明位置引起编译错误
- Ubuntu: 创建PlayOnLinux快捷键 Create PlayOnLinux Application Desktop
- 20211010 PHP笔记
- 读书笔记深入理解JVM01 关于OutOfMemoryError 堆空间的溢出
- 【数据预处理】sklearn实现数据预处理(归一化、标准化)
- 诚之和:谁在抢救瑞幸咖啡?
- App 后台架构设计方案 设计思想与最佳实践
- 视频教程-5小时零基础入门小程序云开发-微信开发
- 微软 文档转换服务器,文档转换器
- 锂电池电量百分比计算_锂离子电池容量计算之电压法
- “在我心里,一直有一个户口本,上面有我们的名字”
- 物联网之IP Camera解决方案简介
- Thingsboard之魔鬼编译,编译失败问题整理,ServerUI
- 前端可视化数据大屏(1)
- 嵌入式开发 面试问答
- C++面试技巧 大厂 某讯 面试试题