程序员如何用Python编程暴力算法破解凯撒密码

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:   破解凯撒密码可以用到一项密码分析技术,叫作暴力算法(brute-force),它的攻击是通过尝试每一种可能解密密文的密钥实现的。没有什么能够阻挡密码分析人员猜测密钥、用密钥解密密文、观察输出,并在没能破解出密文的情况下寻找下一把密钥。正因为这样的暴力算法对凯撒密码来说过于有效,所以在实际应用中根本不应该使用凯撒密码去加密一段秘密信息。  在理想的情况下,一段密文不会落入任何人的手中,然而Kerckhoffs原则(以19世纪密码学家Auguste Kerckhoffs命名)表明,一段密文即使在所有人都知道来源且某些人可能得到的情况下,也应该保持其安全性。20世纪时,数学家Claude S

  破解凯撒密码可以用到一项密码分析技术,叫作暴力算法(brute-force),它的攻击是通过尝试每一种可能解密密文的密钥实现的。没有什么能够阻挡密码分析人员猜测密钥、用密钥解密密文、观察输出,并在没能破解出密文的情况下寻找下一把密钥。正因为这样的暴力算法对凯撒密码来说过于有效,所以在实际应用中根本不应该使用凯撒密码去加密一段秘密信息。

  在理想的情况下,一段密文不会落入任何人的手中,然而Kerckhoffs原则(以19世纪密码学家Auguste Kerckhoffs命名)表明,一段密文即使在所有人都知道来源且某些人可能得到的情况下,也应该保持其安全性。20世纪时,数学家Claude Shannon在《香农格言》(Shannon's maxim)中重新提出了这个原则,即“敌人了解系统”。在密码算法中,是密钥保证了信息的机密性,而在凯撒密码中,密钥的信息非常容易被发现。

  本章要点Kerckhoffs原则和香农格言。暴力算法技术。range()方法。字符串标准化(字符串插值)。

  选中 File

  New File,打开一个新的编辑窗口,将下列代码输入编辑窗口并将其存储为caesarHacker.py。随后,如果读者的计算机中没有pyperclip.py模块,则可以下载它并将它放置在与caesarHacker.py相同的路径下(同一个文件夹中),该模块将在caesarHacker.py文件中被引入。

  结束文件配置后,按 F5键执行程序,如果代码中出现了报错或其他问题,请仔细比对书上代码和文件中代码有何不同。

  caesarHacker.py

  1. # 凯撒密码破解

  2. (BSD Licensed)

  3.

  4. message = 'guv6Jv6Jz!J6rp5r7Jzr66ntrM'

  5. SYMBOLS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz12345

  67890 !?.'

  6.

  7. # 循环遍历所有可能的关键字

  8. for key in range(len(SYMBOLS)):

  9.   # 将translated设置为空字符串很重要,这样可以清除上一个迭代中

  10.   # translated的值

  11.   translated = ''

  12.

  13.   # 程序的其余部分与凯撒程序几乎相同

  14.

  15.   # 循环遍历message中的每一个字符

  16.   for symbol in message:

  17.     if symbol in SYMBOLS:

  18.       symbolIndex = SYMBOLS.find(symbol)

  19.       translatedIndex = symbolIndex - key

  20.

  21.       # 执行回环

  22.       if translatedIndex < 0:

  23.         translatedIndex = translatedIndex + len(SYMBOLS)

  24.

  25.       # 添加解密的字符

  26.       translated = translated + SYMBOLS[translatedIndex]

  27.

  28.     else:

  29.       # 添加未加/解密的字符

  30.       translated = translated + symbol

  31.

  32.   # 显示每一个可能的解密值

  33.   print('Key #%s: %s' % (key, translated))

  注意,本段代码有很大一部分和原始的凯撒密码程序相同,这是因为凯撒密码的破解程序使用了和加密一样的步骤去解密信息。

  运行凯撒密码的破解程序,将会得到如下输出。它使用全部66种可能的密钥解密密文“guv6Jv6Jz!J6rp5r7Jzr66ntrM”,将其成功破解。

  Key #0: guv6Jv6Jz!J6rp5r7Jzr66ntrM

  Key #1: ftu5Iu5Iy I5qo4q6Iyq55msqL

  Key #2: est4Ht4Hx0H4pn3p5Hxp44lrpK

  Key #3: drs3Gs3Gw9G3om2o4Gwo33kqoJ

  Key #4: cqr2Fr2Fv8F2nl1n3Fvn22jpnI

  --snip--

  Key #11: Vjku?ku?o1?ugetgv?oguucigB

  Key #12: Uijt!jt!nz!tfdsfu!nfttbhfA

  Key #13: This is my secret message.

  Key #14: Sghr0hr0lx0rdbqds0ldrrZfd?

  Key #15: Rfgq9gq9kw9qcapcr9kcqqYec!

  --snip--

  Key #61: lz1 O1 O5CO wu0w!O5w sywR

  Key #62: kyz0Nz0N4BN0vt9v N4v00rxvQ

  Key #63: jxy9My9M3AM9us8u0M3u99qwuP

  Key #64: iwx8Lx8L2.L8tr7t9L2t88pvtO

  Key #65: hvw7Kw7K1?K7sq6s8K1s77ousN

  由于第13把密钥得到的输出是标准的英文,因此可以断定原始的加密密钥就是第13把密钥。

  破解程序生成了变量message,用于存储需要解密的密文字符串,常量SYMBOLS则包含了所有可以被加密的字符。

  1. # 凯撒密码破解

  2. # (BSD Licensed)

  3.

  4. message = 'guv6Jv6Jz!J6rp5r7Jzr66ntrM'

  5. SYMBOLS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz12345

  67890 !?.'

  SYMBOLS的值需要和凯撒密码加密程序中使用的SYMBOLS的减肥值完全相同,同时待破解的密文正是由该加密程序得来;否则,破解程序将失效。注意,SYMBOLS字符串中的 0 和 ! 之间有一个空格。

  第8行使用了一个for循环,然而它并没有在一个字符串值上进行迭代,而是在调用range()方法的返回值上进行迭代。

  7. # 循环遍历所有可能的关键字

  8. for key in range(len(SYMBOLS)):

  range()方法接收一个整型参数,并返回range数据类型的值。这种数据类型的值可以在for循环中用于进行指定次数的循环,循环次数由传递给range()方法的整数决定。尝试下面的例子,将下列代码输入交互式运行环境中。

  >>> for i in range(3):

  ...  print('Hello')

  ...

  Hello

  Hello

  Hello

  由于将整数3传递给了range()方法,因此for循环将进行3次循环。

  更确切地说,range()方法返回的range值会将for循环的变量值设置为0~输入的参数值(不包含后者),例如,将下列代码输入交互式运行环境中。

  >>> for i in range(6):

  ...  print(i)

  ...

  这段代码将变量i的值设置为0~6(不包含6),与caesarHacker.py文件的第8行类似——文件的第8行将key的值设置为0~66(不包含66)。为了避免将66直接硬编码到程序中,程序使用了len(SYMBOLS)的返回值,因此即使改变SYMBOLS的值,程序的运行也不会受到影响。

  程序首次执行到循环时,key被设置为0,message中的密文被密钥0解密(当然,如果0并不是真正的密钥,message会被解密为乱码)。for循环内部的第9~31行代码用于解密,并且与原始的凯撒密码加密程序类似,之后会对其进行解释。程序执行到下一次对for循环的迭代时,key被设置为1,继续进行解密。

  尽管这个程序中没有用到,读者还是可以尝试向range()方法中传递两个整型参数,而不像本程序中只使用了一个。第1个参数是range的起始值,第2个参数则是range的终值(range从起始值开始取值,但并不会取到终值),两个参数用逗号隔开。

  >>> for i in range(2, 6):

  ...  print(i)

  ...

  变量i的取值为2~6(含2而不含6)。

  for循环之下用于解密的代码,每次执行都将解密后的文本添加到translated字符串的末尾。在第11行,translated被置为空字符串。

  7. # 循环遍历所有可能的关键字

  8. for key in range(len(SYMBOLS)):

  9.   # 将translated设置为空字符串很重要,这样可以清除上一个迭代中

  10.   # translated的值

  11.   translated = ''

  在for循环的开始将translated置空非常重要,如果不这么做,则本次尝试的密钥解密出的文本将被添加到上一次迭代后生成的字符串后面。

  第16~30行和第5章中的凯撒密码加密程序几乎是相同的,但是要比第5章中的代码更简单一些,因为它们只被用作解密。

  13.   # 程序的其余部分与凯撒程序几乎相同

  14.

  15.   # 循环遍历message中的每一个字符

  16.   for symbol in message:

  17.     if symbol in SYMBOLS:

  18.       symbolIndex = SYMBOLS.find(symbol)

  在第16行中,程序循环遍历了message中存储的每一个字符。每经过一次循环迭代,第17行就检查symbol是否存在于常量SYMBOLS中,如果存在,就对其进行解密。第18行的find()方法对symbol在SYMBOLS中的位置进行确定,并将这个位置的值记录在变量symbolIndex中。

  随后,第19行从symbolIndex中减去key值进行解密。

  19.       translatedIndex = symbolIndex - key

  20.

  21.       # 执行回环

  22.       if translatedIndex < 0:

  23.         translatedIndex = translatedIndex + len(SYMBOLS)

  减法操作可能会导致translatedIndex的值小于0,这时就需要回到常量SYMBOLS的开头去寻找解密出的字符位置。第22行对可能的情况进行判断,如果出现了translatedIndex值小于0的情况,就为其加上66[len(SYMBOLS)的返回值]。

  translatedIndex的值改变后,SYMBOLS[translatedIndex]就可以获取解密得到的字符了。第26行将这个字符添加到translated存储的字符串末尾。

  25.       # 添加解密的字符

  26.       translated = translated + SYMBOLS[translatedIndex]

  27.

  28.     else:

  29.       # 添加未被加/解密的字符

  30.       translated = translated + symbol

  如果symbol的值没有在SYMBOLS中找到,则第30行将把它保持不变地添加到translated的结尾。

  虽然第33行是凯撒密码破解程序中唯一的一个print()方法,但它会得到多行执行结果,这是因为第8行的for循环每进行一次迭代,它就将被调用一次。

  32.   # 显示可能的解密值

  33.   print('Key #%s: %s' % (key, translated))

  print()方法中的参数是一个使用了字符串标准化(string formatting,也叫作字符串插值)的字符串。字符串标准化使用%s将一个字符串放置到另一个字符串当中,在这个字符串的结尾,第1个%s被括号中的第一个值替换。

  将下列代码输入交互式运行环境。

  >>> 'Hello %s!' % ('world')

  'Hello world!'

  >>> 'Hello ' + 'world' + '!'

  'Hello world!'

  >>> 'The %s ate the %s that ate the %s.' % ('dog', 'cat', 'rat')

  'The dog ate the cat that ate the rat.'

  本例中,首先将字符串world插入字符串“Hello %s!”,替换掉%s。这个过程和连接起%s之前、待插入的字符串、%s之后这三部分文本的过程是类似的,当需要插入多个字符串的时候,%s按照这些字符串的顺序被依次替换。

  字符串标准化往往比使用 + 操作符对字符串进行连接更便于输入,尤其是在面对长字符串的情况下。同时,与字符串连接不一样的是,使用字符串标准化甚至可以将非字符型的值(如整型)插入字符串中。将如下代码输入交互式运行环境。

  >>> '%s had %s pies.' % ('Alice', 42)

  'Alice had 42 pies.'

  >>> 'Alice' + ' had ' + 42 + ' pies.'

  Traceback (most recent call last):

  File "", line 1, in

  TypeError: Can't convert 'int' object to str implicitly

  使用字符串插值的时候,整数42可以非常顺利地插入字符串中,然而如果想要通过字符串连接将它插入字符串中,就会出现报错。

  caesarHacker.py文件的第33行使用字符串标准化生成了一个包含变量key和translated的字符串。由于key中存储的是一个整数的值,因此使用字符串标准化就可以将它作为字符串的值传递到print()方法中了。

  凯撒密码的致命弱点在于,用于加密的密钥并没有太多种可能性,任何计算机都可以轻易使用全部66种可能的密钥解密信息,密码分析人员只需要花几秒钟的时间浏览解密后的内容,就可以找到其中符合英文语法的一项。要使消息更安全,需要一种拥有更多可能密钥的算法,而在第7章中,移位密码就可以提供这样的安全性。

目录
相关文章
|
23天前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
2月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
172 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
13天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
41 12
|
12天前
|
算法 安全 网络安全
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
45 9
|
25天前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
3月前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
137 66
|
19天前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
35 10
|
2月前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
57 17
|
2月前
|
存储 人工智能 算法
解锁分布式文件分享的 Java 一致性哈希算法密码
在数字化时代,文件分享成为信息传播与协同办公的关键环节。本文深入探讨基于Java的一致性哈希算法,该算法通过引入虚拟节点和环形哈希空间,解决了传统哈希算法在分布式存储中的“哈希雪崩”问题,确保文件分配稳定高效。文章还展示了Java实现代码,并展望了其在未来文件分享技术中的应用前景,如结合AI优化节点布局和区块链增强数据安全。
|
9天前
|
存储 算法 量子技术
解锁文档管理系统高效检索奥秘:Python 哈希表算法探究
在数字化时代,文档管理系统犹如知识宝库,支撑各行各业高效运转。哈希表作为核心数据结构,通过哈希函数将数据映射为固定长度的哈希值,实现快速查找与定位。本文聚焦哈希表在文档管理中的应用,以Python代码示例展示其高效检索特性,并探讨哈希冲突解决策略,助力构建智能化文档管理系统。

热门文章

最新文章