背景

在密码学中,恺撒密码(英语:Caesarcipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。例如,当偏移量是左移3的时候(解密时的密钥就是3):

明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ ;
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC。

使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如:

明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG ;
密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ。

思路

加密

  • 首先读入密钥和明文
  • 然后将明文(字母)逐位循环右移k位
  • 输出密文

解密

  • 首先读入密文
  • 然后穷举所有可能的密钥(26种)
  • 对于每一个密钥对密文做循化左移
  • 对处理后的句子做分割,分隔符是处理字母以外的其他符号
  • 判断得到的单词在字典里面是否能找到,并统计每一句里面的个数
  • 最后含有最多可识别单词的句子即为明文
  • 输出破解出明文和密钥

实现

加密

'''
此程序用来做Caesar密码的加密工作
输入明文和密钥则可以生成对应的密文
原理是:明文的每一位字符都在字母表上循环右移key位
'''key = int(input("请输入密钥(0~25之间的整数):\t"))
# key=1plaintext = input("请输入要加密的明文:\t")
# plaintext="abcxyz ABCXYZ" # 测试用# 此处可添加key和text的格式检查print("\n您输入的key为:",key)
print("您输入的明文是:", plaintext, "\n") # 输入的明文可以包含任意非换行符的字符 但除大小写字母外 均被认为是分隔符secrettext = []  # 字符串不可修改 用列表转换而来
for i in plaintext:  # 依次处理字符串中的每个字符if i.isalpha():  # 是字母才处理if i.islower():  # 判断是小写字母i = chr((ord(i) - 97 - key) % 26 + 97)  # 小写字母 循环右移 key位else:i = chr((ord(i) - 65 - key) % 26 + 65)  # 大写字母 循环右移 key位secrettext.append(i)
secrettext="".join(secrettext)  # 列表转换成字符串print("变化后的密文是:",secrettext)

解密

'''
此程序用来做Caesar密码的解密工作
输密文可以破解出对应的密钥和明文
原理是:暴力穷举所有可能的key 对照字典查看哪种情况的文本最规范 则认为其是答案
'''import enchantd = enchant.Dict("en_US")  #用来查询的字典
real_key = 0  # 密钥
plaintext = ""  # 明文secrettext = input("请输入要解密的密文:\t")tmp = 0
for key in range(26):in_plaintext = []for i in secrettext:  # 依次处理字符串中的每个字符if i.isalpha():  # 是字母才处理if i.islower():  # 判断是小写字母i = chr((ord(i) - 97 + key) % 26 + 97)else:i = chr((ord(i) - 65 + key) % 26 + 65)else:i = " "  # 不是字母的统一当作界符 并用空格统一替换in_plaintext.append(i)in_plaintext = "".join(in_plaintext)in_plaintext_s = in_plaintext.split(" ")  # 以空格区分单词accuracy = 0  # 命中率 转换成明文之后 句子中可识别的单词for word in in_plaintext_s:if word != "":accuracy += d.check(word)  # 在词典中查询单词是否存在if accuracy > tmp:  # 找到命中率最高的一个key 即为最终答案tmp = accuracyreal_key = keyplaintext = in_plaintext# 下面输出每个key 对应的命中率 以及翻译出的明文 不需要可以注释掉print("key:", str(key).center(3, " "), "\taccuracy:", accuracy, "\tplaintext: ", in_plaintext)print("\nkey:", real_key, "\nreal_plaintext:", plaintext)

测试

加密

root@xxx # python3 Caesar_make.py
请输入密钥(0~25之间的整数):   3
请输入要加密的明文:  Love what you do, Follow your heart.您输入的key为: 3
您输入的明文是: Love what you do, Follow your heart. 变化后的密文是: Ilsb texq vlr al, Cliilt vlro ebxoq.

可见程序正确的将明文进行了加密,区分出大小写字母以及其他符号。

解密

root@xxx # python3 Caesar_solve.py
请输入要解密的密文:  Ilsb texq vlr al, Cliilt vlro ebxoq.
key:  0     accuracy: 0     plaintext:  Ilsb texq vlr al  Cliilt vlro ebxoq
key:  1     accuracy: 0     plaintext:  Jmtc ufyr wms bm  Dmjjmu wmsp fcypr
key:  2     accuracy: 0     plaintext:  Knud vgzs xnt cn  Enkknv xntq gdzqs
key:  3     accuracy: 7     plaintext:  Love what you do  Follow your heart
key:  4     accuracy: 0     plaintext:  Mpwf xibu zpv ep  Gpmmpx zpvs ifbsu
key:  5     accuracy: 0     plaintext:  Nqxg yjcv aqw fq  Hqnnqy aqwt jgctv
key:  6     accuracy: 1     plaintext:  Oryh zkdw brx gr  Iroorz brxu khduw
key:  7     accuracy: 0     plaintext:  Pszi alex csy hs  Jsppsa csyv lievx
key:  8     accuracy: 1     plaintext:  Qtaj bmfy dtz it  Ktqqtb dtzw mjfwy
key:  9     accuracy: 0     plaintext:  Rubk cngz eua ju  Lurruc euax nkgxz
key:  10    accuracy: 0     plaintext:  Svcl doha fvb kv  Mvssvd fvby olhya
key:  11    accuracy: 0     plaintext:  Twdm epib gwc lw  Nwttwe gwcz pmizb
key:  12    accuracy: 0     plaintext:  Uxen fqjc hxd mx  Oxuuxf hxda qnjac
key:  13    accuracy: 0     plaintext:  Vyfo grkd iye ny  Pyvvyg iyeb rokbd
key:  14    accuracy: 1     plaintext:  Wzgp hsle jzf oz  Qzwwzh jzfc splce
key:  15    accuracy: 1     plaintext:  Xahq itmf kag pa  Raxxai kagd tqmdf
key:  16    accuracy: 0     plaintext:  Ybir jung lbh qb  Sbyybj lbhe urneg
key:  17    accuracy: 0     plaintext:  Zcjs kvoh mci rc  Tczzck mcif vsofh
key:  18    accuracy: 0     plaintext:  Adkt lwpi ndj sd  Udaadl ndjg wtpgi
key:  19    accuracy: 0     plaintext:  Belu mxqj oek te  Vebbem oekh xuqhj
key:  20    accuracy: 0     plaintext:  Cfmv nyrk pfl uf  Wfccfn pfli yvrik
key:  21    accuracy: 0     plaintext:  Dgnw ozsl qgm vg  Xgddgo qgmj zwsjl
key:  22    accuracy: 0     plaintext:  Ehox patm rhn wh  Yheehp rhnk axtkm
key:  23    accuracy: 1     plaintext:  Fipy qbun sio xi  Ziffiq siol byuln
key:  24    accuracy: 0     plaintext:  Gjqz rcvo tjp yj  Ajggjr tjpm czvmo
key:  25    accuracy: 0     plaintext:  Hkra sdwp ukq zk  Bkhhks ukqn dawnp key: 3
real_plaintext: Love what you do  Follow your heart 

可见程序正确进行了解密,获得的密钥与明文与真实情况相同。

Caesar密码的生成与破解相关推荐

  1. BIOS密码的去除与破解

    BIOS密码的去除与破解 密码固然有保护作用,但若自己忘了密码却会带来麻烦. 要学会去除和破解密码. 一.密码的去除: 密码的"去除"是指在已经知道密码的情况下去除密码. 方法是: ...

  2. 凯撒密码加解密及破解实现原理

    概念及原理 根据百度百科上的解释,凯撒密码是一种古老的加密算法. 密码的使用最早可以追溯到古罗马时期,<高卢战记>有描述恺撒曾经使用密码来传递信息,即所谓的"恺撒密码" ...

  3. 苹果6访问限制密码4位_破解6位密码只需4秒!3步设置密码挡住黑客

    你的密码安全至关重要 首先要知道的是,破解密码有两种方法,第一种是暴力破解,也就是挨个密码去尝试,直到试对为止.暴力破解的很明显问题是,密码越长,破解密码的时间就会成倍增加,一旦密码超过了某个长度,基 ...

  4. c++、python实现置换密码(栅栏技术,列置换)、替代密码(加法密码(Caesar密码),乘法密码)

    置换密码 代码如下: #置换密码 a = input('请输入明文:') print("逆序后的密文为:",a[::-1]) 结果如图: 代码如下: #栅栏技术(栏数为7) a = ...

  5. 古典密码算法 凯撒(Caesar)密码,又叫循环移位密码

    古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密.它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密.下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密 ...

  6. 单表代换密码之Caesar密码的代码实现

    单表代换密码之Caesar密码的代码实现 代码块 代码块语法遵循标准markdown代码,例如: from operator import mod #ceasar加密算法 def ceasarC(a) ...

  7. linux用户登录报密码不对,Linux用户登录密码的生成

    一.从自动化需求说起 如何生成一个Linux用户登录密码?可能有人会说用passwd生成.的确,passwd命令能够帮助我们重置用户登录密码,但是这并没有解答如何生成一个Linux用户登录密码的疑问. ...

  8. python123测验5随机密码生成_基于社会工程学的弱口令密码字典生成工具

    Chinese Common User Passwords Profiler 基于社会工程学的弱口令密码字典生成工具 使用方法 : 第一步 : 定义已知信息 class Person: NAME = ...

  9. 随机数字图片验证码的原理、生成和破解

    http://sxdt.h.baike.com/article-1307487.html 随机数字图片验证码的原理.生成和破解 2013-10-21 10:27:49 本文行家:jdsongss 随机 ...

最新文章

  1. 指针数组 数组指针 函数指针 指针函数
  2. keras从入门到放弃(三)逻辑回归 softmax
  3. oracle锁表语句执行提示无法终止当前对话_Oracle 强制中止正在执行的SQL语句
  4. iris数据集 测试集_IRIS数据集的探索性数据分析
  5. 你只会用 StringBuilder?试试 StringJoiner,真香!
  6. Android学习笔记06---电话拨号器的制作:项目结构深化
  7. carrot2中lingo实现总结(一)
  8. vmware-Esxi6.5实际安装
  9. jQuery UI autocomplete
  10. SOC 时钟源PLL锁相环详细介绍——IC设计时序逻辑的灵魂
  11. 什么是ISO?ISO增值的作用
  12. java线程报时代码_什么?一个核同时执行两个线程?
  13. pyecharts制作地图Map
  14. XAMPP 的安装配置
  15. 基于MDB_ICP协议的纸币识别器与自动售货机通讯的研究
  16. codevs 4189 字典树
  17. Python excel提取表格信息整理到word中
  18. HTML/CSS常见面试题
  19. 数字图像处理艺术化效果——怀旧效果(泛黄旧照片)
  20. 高频功率放大器损耗电阻怎么计算

热门文章

  1. MapBoxGL 入门
  2. 投资理财 A股小知识
  3. python print时清除上一行_python3,如何用print清除行覆盖?
  4. vs code 离线安装 CodeLLDB 包
  5. 【趣味编程】第1期。用python做简易版音乐下载器
  6. VNT6656G无线网卡在mini2440 上的移植
  7. Ubuntu18.04安装ROS最后的rosdep update不成功解决方案(亲测可行)
  8. poi设置word表格单元格宽度_java poi如何设置word的页面的大小和水平方向?
  9. 入职5G网络优化工程师,税后9k,周末双休,你也可以!—分享优橙小故事
  10. 如果用SEO来优化好论坛,提高排名