Caesar Cipher

前言

好久没更新博客了,今天我们来共同学习关于恺撒密码(Caesar Cipher)项目。可能对大多数人来讲,并不知道什么是恺撒密码,其实一开始我也不懂,也是查阅了相关资料才了解了什么是Caesar Cipher,恺撒密码说白了是字母密码加密的一种方式,比如你用一段英文给对方发送一则消息,但是你又不想你的消息被第三者知道,那么就可以通过恺撒密码进行传递,将你要传递的消息字母在密钥数字的加密下把正常的一则消息变成一串“乱码”,当然你的通信对象是了解你们之间的“协议”(通信密钥数字)的。今天要讲的项目就是通过程序来将消息明文加密成密文,将密文破解成消息明文。

一、恺撒密码介绍

恺撒密码的核心是凯撒密码的密钥,是 1 到 26 之间的一个数字。如果要破解密文就必须要知道这个密钥(也就是知道用于加密消息的数字),否则无法对这个保密的代码进行解密。
前面我们讲到,恺撒密码是用字母来传递,且要用到专门设置的密钥,那么具体传递方式是什么样的呢。
首先我们将要传递的消息(用字母、数字、符号组成)写下,并用一个
“移位后的”字母来代替它,移位个数就是前面我提到的密钥。替换完成的新“消息”(实则已经是乱码)完全隐藏了我们要传递的消息 内容。例如把字母 A 移动 3格,就会得到字母 D。如果把 A 移动两格,就会得到字母 C。依次将所有的明文消息码通过“移位”变成没有可读性的密文。
如果以 3 作为一个密钥来加密明文“Howdy”,则:
● 字母“H”变成了“K”;
● 字母“o”变成了“r”;
● 字母“w”变成了“z”;
● 字母“d”变成了“g”;
● 字母“y”变成了“b”。
秘文“Howdy”用 3 作为密钥进行加密,变成了“Krzgb”。

二、ASCII 码以及用数字表示字母

1.什么是ASCII码

ASCII码(American Standard Code for Information Interchange,美国标准信息交换代码)是一种代码,它将每个字符和 32 到 126 之间的一个数字进行关联。大写字母“A”到“Z”是 ASCII 数字 65 到 90。小写字母“a”到“z”是 ASCII 数字97 到 122。数字“0”到“9”的 ACSII 数字是 48 到 57。表 15-1 展示了所有的 ASCII 字符和编码。
现代计算机使用 UTF-8,而不是 ASCII。但是 UTF-8 向后兼容 ASCII,所以 ASCII 字符的 UTF-8 编码和 ASCII 的编码是一样的。

因此,如果想要把“A”移动 3 格,需要像下面这样做:
● 把“A”转换成编码(65);
● 65 加 3,得到 68;
● 把编码 68 转换回字母(“D”)。

2.函数chr()和ord()

函数 chr()(“character”的简写)接受一个整数形式的顺序编码,并且返回单个字符的字符串。ord()函数接受单个字符的字符串,并且返回整数形式的顺序编码。输入如下代码:

>>ord('Y')
89
>>chr(89)
'Y'
>>chr(ord('Y'))
'Y'

这两个函数主要用于对明文消息的加密,以及将密文消息的破解作用,具体怎么工作,接下里我们将继续讲!

三、程序的设计

1.主体程序代码

加密明文的核心是先将明文的所有字母、数字、符号转化为数字,主要通过chr()函数来实现,在将数字集(转化后的明文消息)加上密钥数字(明文字母后移则对应密文字母表后面的字母,字母越靠后对应的ASCII码数字越大,因此转化后数字明文应当加上密钥数字)。得到新的密文数字,再将密文数字通过ord()函数转化为密文字母,得到的就是恺撒密码了。整体的程序设计核心是这个思路!

# Caesar Cipherdef getTranslatedMessage(mode, message, key):if mode[0] == 'd':key = -key  # 如果是解密(d)工作模式,则密钥为负数translated = ''  # 加(解)密生成的密(明)文for symbol in message:  # 遍历密(明)文信息if symbol.isalpha():  # 如果是字母num = ord(symbol)  # 获取字母的ASCII码,注意:ord()函数只能用于将字母转化为ASCII码的数字num += key  # 通过密钥对密文进行移位操作从而获得真实的明文字母if symbol.isupper():  # 所有密文字母是大写if num > ord('Z'):num -= 26elif num < ord('A'):num += 26elif symbol.islower():if num > ord('z'):num -= 26elif num < ord('a'):num += 26translated += chr(num)else:translated += symbolreturn translatedmode = getMode()
message = getMessage()
key = getKey()print('Your translated text is:')
print(getTranslatedMessage(mode, message, key))

2.模块分析

模式(加密、解密)选择函数

def getMode():while True:print('Do you wish to encrypt or decrypt a message?')mode = input().lower()if mode in 'encrypt e decrypt d brute b'.split():return modeelse:print('Enter either "encrypt" or "e" or "decrypt" or "d".')

说明:此函数主要供用户选择模式专用比较简单,就是返回一个用户输入的选项(解密还是加密)。

加(解密)对象函数

def getMessage():print('Enter your message:')return input()

密钥(数字)选择函数

def getKey():key = 0while True:print('Enter the key number (1-%s)' % (MAX_KEY_SIZE))key = int(input())if (key >= 1 and key <= MAX_KEY_SIZE):return key

说明:这里要要注意的密钥数字的选择范围,密钥数字为什么只能是26以内的数字,由于英文字母只有26个,因此我们的“移位”范围只能在26之内。这样才能不至于使字母被替换成了其他符号!

总结

总的来讲项目不是太难,比较简单,而且涉及的函数不是特别多用到的Python方法也不多,都是常用的字符串方法,很适合大家练练手。就程序本身而言,还有些不足,比如密钥太少,在今天日益发达的互联网时代,26个数字的密钥太容易被破解了,只要将26个密钥数字一个个带入其中很容易破解密码!
那么接下里我们将就如何暴力破解再分析下!

延伸阅读

我们在不知道密钥数字的情况下,可以把26个数字一个个用来试总有一款能获取到我们要的明文消息,当然我们将这项繁琐的工作交给计算机来处理。
既然是一个个的试密钥,这时候我们想到Python的循环迭代可以帮我们处理这个工作。

print('Your translated text is:')
if mode[0] != 'b':key = getKey()print(getTranslatedMessage(mode, message, key))
else:for key in range(1, MAX_KEY_SIZE + 1):print(key, getTranslatedMessage('decrypt', message, key))

说明:首先我们将用户输入密钥的方式改为for循环迭代的方式,当模式选择为解密就将密钥提供函数改为range()函数for循环迭代,这样就可以将所有(26个数字)可能密钥添加到主体程序中试,最后得到的结果可以很快找到消息原始消息明文。

恺撒密码项目分享到此告一段落了。
——————————————
码字不易。

希望每一期的分享对大家有所帮助,也感谢大家多多支持作者。

要想学习更多有关Python知识可以点击关注作者,或者评论区留言,我会不定期更新分享有关Python学习的知识,你们的每一次点赞收藏关注都是对作者最大的鼓励。

Python学习——Caesar Cipher密码破解(加密)方法相关推荐

  1. mysql修改root密码 工具下载_学习mysql root密码修改的方法及工具使用

    本文介绍 学习mysql root密码修改的方法及工具使用,包括使用phpmyadmin.mysql服务配置工具.mysqladmin等. 供大家学习参考. 一,phpmyadmin 使用phpmya ...

  2. Foxmail 本地邮箱密码破解思路方法分享

    本文主要以POP3为例讲解, 其他邮件协议可以参考思路, 自行尝试解决. 最近发生了一件比较尴尬的事, 公司邮箱密码忘记了, 又不想麻烦IT部门更改, 就想尝试下自己破解下本地的密码. (反正密码已经 ...

  3. 密码危机:深度学习正在加速密码破解!

    http://blog.itpub.net/28285180/viewspace-2157266/ 信息安全专家们一直在探索"生成式对抗网络"(GAN)如何提高我们的在线安全性,并 ...

  4. python编写凯撒密码的加密函数_python实现 古典密码 凯撒密码的加密与解密

    python实现 古典密码 凯撒密码的加密与解密 实现效果如下图: # 凯撒密码加密与解密 # author Sundm string = ['a','b','c','d','e','f','g',' ...

  5. Python常见的几种代码加密方法

    参考地址:https://www.cnblogs.com/dhcn/p/11077447.html 0 前言 去年11月在PyCon China 2018 杭州站分享了 Python 源码加密,讲述了 ...

  6. 【去除控制】 对学生机房管理助手密码破解实践方法 2st

    本文仅以学习交流为目的请勿用于非法用途 [去除控制]对学生机房管理助手密码破解的分析 1st https://blog.csdn.net/qq_37485351/article/details/932 ...

  7. Windows用户密码的加密方法与破解

    再研究Hastcat的时候涉及到了Windows的Hash破解,感觉这个地方还是有一些姿势点和细节的,特此写文章记录之. Hash简介 Hash 一般翻译为"散列",也可直接音译为 ...

  8. 凯撒(caesar)密码加解密方法

    凯撒加密(Caesarcipher)是一种简单的消息编码方式:它根据字母表将消息中的每个字母移动常量位k. 举个例子如果k等于3,则在编码后的消息中,每个字母都会向前移动3位: a会被替换为d:b会被 ...

  9. Python实现凯撒密码的加密与解密

    在密码学中,我们把想要加密的消息叫做明文(plain text).把明文转换成加密后的消息叫做对明文加密(encrypting),明文加密后变成(cipher text). 凯撒密码的密钥是1到26之 ...

  10. python学习日记(基础数据类型及其方法02)

    python的变量 python中的变量不需要声明,变量载使用前必须被赋值,变量被赋值以后才会被创建. 在python中变量就是变量,没有数据类型.我们所说的类型是变量所指向内存中的对象的类型. py ...

最新文章

  1. php的yii2框架下开发环境xampp,vim,xdebug,DBGp的搭建
  2. 2.7 Inception 网络-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  3. vue 分模块打包 脚手架_手动撸一个webpack4脚手架(仿vuecli2)
  4. ASP.NET文件操作收藏
  5. COM本质论学习笔记(一)IDL
  6. JDK14性能管理工具:jstat使用介绍
  7. 在.NET Core中使用MySQL5.7的JSON类型字段
  8. spring aop实例讲解_【好好面试】手把手调试,教你分析Spring-Aop
  9. 如何创建控制台应用程序
  10. 阿里巴巴线上面试总结
  11. HDU-3237 Help Bubu(状压dp)
  12. 基于单片机1KW高频感应加热器控制系统仿真设计(毕设)
  13. 什么是BI、ETL、DW
  14. 绵阳师范学院2021计算机考试,绵阳师范计算机学院2021年招生计划
  15. python画高德地图
  16. 国内首家,阿里云发布Redis全球多活版
  17. java获取前五分钟时间,java计算下一个整5分钟时间点
  18. 20個網頁抓取工具快速抓取網站
  19. 跨平台2D游戏引擎CloudBox
  20. Chrome关闭后无法打开

热门文章

  1. AI cs5序列号 注册机
  2. 由连连看游戏作弊器想到的
  3. 评估电源质量20M带宽限制的问题
  4. 中国农业大学计算机专硕2019分数线,中国农业大学2019年硕士研究生复试分数线...
  5. Cloud Rush—聚是一团火
  6. Citrix ADC中SNIP的三种配置场景
  7. 清理服务器系统日志,win2008服务器清理系统日志
  8. 浅谈代理服务器的作用
  9. 弹性地基梁板实用计算_YJK软件前处理之计算参数的设置(上篇)
  10. PyTorch模型 .pt、.pth与.pkl 的区别