解密恐怕是每个人的少年梦,就算是现在每当听到破译都会一阵激动。如果你曾经因为冲动去了解过加密密文,你一定听说过一种加密方法:替代加密

替代加密是一种最简单的加密方法,简单的把明文中的每一个字母使用另一个固定字母代替。

使用R模拟实现一个简单的替代加密算法,并用三个单词进行测试:其中红色框框中框出部分位算法实现部分。(替代算法分为简易替换密码、谐音替换法、多表替换加密、表格式替换加密、机械替换加密、一次性密码本,而本文所讨论的是简单替换密码中的混合表加密方式)

对于每一种替代加密都有一份替换表,如果我们知道这份替换表,我们只需要简单的把密文中的每个字母按照替换表进行替换即可;但是当我们拿到一份密文并且没有替换表的时候我们应该如何破译这份密码呢?

现在假设我们有一段标准的通过替换加密得到的的英文密文:nhdg asjc llpgax,同时我们有两个已知的可能的替换表:

  • 替换表1的解密结果:njgh xlij ddsjxe

  • 替换表2的解密结果:make does thanku

我们会发现替换表2的结果更像是标准的英文,替换表2解密的结果更像是明文。那么现在如果我们有无数个替换表,则总有一个替换表是最接近正确替换表的,而这个替换表就是我需要寻找的替换表,破译问题变成了是优化问题。

如何查找那个最优化的替换表呢?这个时候Metropolis方法就派上了用场:

基本思想是首先从一个随机的解密规则开始,然后通过多次循环优化它,直到最后它就有可能成为一个正确的解谜规则。

至此我们已经有了寻找最优破译解法的方法了,但是问题来了:如何通过一个现有的破解规则来得到一个新的破解规则呢?我们不可能盲目的一个一个的随机产生破解规则,那样的工作量是不可想象的。

通过Metropolis方法的定义我们知道,Metropolis方法会不断地对上一个随机的解密规则做优化,也就是说第二个随机解密规则是在第一个解密规则上做优化即我们只需要在第一个随机解密规则上做一点点小小的改动就可以生成下一个随机解密规则;并且当且仅当新的解密规则解出的解密串比原解密规则解出的解密串更像是标准英语的时候才会用新的解密规则代替原有的解密规则。

破译的方法思路出来了,紧接着我们就去实现这个解法,实现这个算法有两处难点。

  • 对前一个随机解密规则如何改动

  • 如何计算解密规则是正确规则的概率

对于第一点,我们只需要改变原始解密规则中的一个字母的对应关系,比如在原始解密规则中a对应b,c对应d,则修改规则把a对应到d,为了保证一个合法的解密规则,我们同时需要把c对应到b

对于第二点,假设对于一个密文,一个随机解密规则计算出的结果是:njgh xlij ddsjxe,有三个单词,我们分别计算三个单词可能为合法单词的概率。一个单词为合法单词的概率,可以通过查询它在维基百科出现的频率。

总结以上思路,使用R描述代码部分截图如下:

使用单词'here', 'is', 'some', 'sample', 'text'做测试,加密并尝试解密50000次,解密次数越多可能获得正确结果的概率越大,得出的计算过程以及每一次的优化的解密规则如下(值得注意的是较小的值可能是正确的解密结果,但是最小的值并不一定是那个正确的解密结果),在45000次左右查找到最接近正确的解密规则,当然在明文中随着单词数量的增加破译的答案会越来越接近正确答案。

本实例为阅读《机器学习:实用案例解析》书后受启发写出,感谢书籍作者,对本案例感兴趣想要重新实现本案例的同学也可以阅读此书,pdf版本地址:链接: https://pan.baidu.com/s/1c12oCaW 密码: ebnt

本文守首发在公众号:一个程序员的日常

转载于:https://my.oschina.net/passer007/blog/842795

初探密码破译:Metropolis-Hastings算法破解密文相关推荐

  1. Metropolis–Hastings算法

    1蒙特卡洛方法 蒙特卡罗方法也称统计模拟方法,是一种以概率统计理论为指导的数值计算方法.蒙特卡洛方法的基本思想是,当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种" ...

  2. MCMC中的Metropolis–Hastings算法与吉布斯采样

    Metropolis–Hastings算法是一种具体的MCMC方法,而吉布斯采样(Gibbs Sampling)是Metropolis–Hastings算法的一种特殊形式.二者在机器学习中具有重要作用 ...

  3. R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样

    创建测试数据 第一步,我们创建一些测试数据,用来拟合我们的模型.我们假设预测变量和因变量之间存在线性关系,所以我们用线性模型并添加一些噪音. trueA <- 5trueB <- 0tru ...

  4. mh采样算法推导_科学网—MCMC中的Metropolis Hastings抽样法 - 张金龙的博文

    Metropolis Hastings抽样法示例 jinlongzhang01@gmail.com Metropolis Hasting(下面简称MH)是蒙特卡罗马尔科夫链中一种重要的抽样方法.本文简 ...

  5. 密码破译问题:地球和天女星座开战了,你是地球防卫军的密码破解员,以下你是破解出来的部分密码 tyt:好 huy:这 bvn:天 jkl :是 lgc:你 qqq:哈

    tyt:好    huy:这    bvn:天   jkl :是  lgc:你  qqq:哈    dz:才    aer:人   zse:个    uef:真    out:妙   ygh:小 内容 ...

  6. 美国自称最安全密码:100万年才能破解,却被一位中国宝妈拿下

    在信息时代,情报和密码对国家至关重要.战争时期和和平时期的军事密码都属于国家机密,因为一旦它们被其他国家破解,就会对国家造成严重损害,甚至决定战争的成败.在获取信息和信息安全方面,美国一直高度关注,开 ...

  7. 逆向工程实验_pre1(密码学算法破解)

    文章目录 一.Base64编码算法 二.pyc文件反编译 三.sha1算法破解 四.数据库的sha1密码破解 一.Base64编码算法 一.搜索Base64算法资料,详细解释该算法.用Python实现 ...

  8. 仿射密码之加解密及破解

    [题目] 1) 实现仿射密码,具体要求: A. 实现仿射密码加密过程,由用户输入密钥,可以对任意输入的明文进行加密: B. 根据用户输入的加密密钥,自动生成解密密钥,并能对加密密文进行解密: C. 实 ...

  9. 人与计算机猜数游戏,猜数字(古老的的密码破译类益智类小游戏)_百度百科...

    猜数字 (古老的的密码破译类益智类小游戏) 语音 编辑 锁定 讨论 上传视频 猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人 ...

最新文章

  1. SQL与NoSQL的区别 以MySQL与MongoDB为例
  2. Python 代码转 Latex 公式,这个开源库用一行代码帮你搞定
  3. Discuz X2论坛数据库MyISAM转InnoDB的脚本
  4. 盘点机器学习和统计模型的差异
  5. 【Oracle】undo 自动调优
  6. 目标检测--边界框(bounding box)解析
  7. 4k视频写入速度要求_为什么视频工作者需要外置硬盘?
  8. WIN8 启用虚拟AP 以共享网络,使手机电脑一起网上冲浪
  9. 丢了好几年的 Auto CAD又拿起来......
  10. 某银行大型管理系统端到端持续集成和交付实践
  11. 网格布局之网格元素放置算法
  12. shell数值大小的比较
  13. 拨开云雾见日月:SQL Server 调优之查询存储
  14. failed to accept an incoming connection: connection from 127.0.0.1 rejected, allowed hosts:
  15. GoFrame v1.6.0 发布,Go 应用开发框架
  16. linux远程登录失败锁定,登录失败锁定策略配置登录超时策略禁用root远程登录脚本...
  17. 利用华为ENSP模拟器分析和配置中小型企业网络的综合实验(下)
  18. win10c盘扩容_如何给磁盘进行扩容/拆分/合并的操作?保姆级教学
  19. 字节跳动 5 万人远程办公的背后,飞书的演进之路
  20. Python解析百度地图各省市经纬度(二)

热门文章

  1. 常见的NoSQL数据库介绍
  2. web高德地图路线规划(多条)
  3. GaussianNetwork高斯网络
  4. 下载Nexus老版本war包
  5. tensorflow.keras.models.Sequential——predict()、predict_classes()、predict_proba()方法的区别
  6. 王阳明心学 之 心即理感悟
  7. SAP JCo应用方案
  8. 网络安全 - 一名合格的Web安全工程师之成长路径
  9. virtualbox导入ovf文件
  10. C 语言中负数移位运算讲解