初探密码破译:Metropolis-Hastings算法破解密文

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

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

使用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值