在密码学中,凯撒密码(英语:Caesar cipher),或称凯撒加密、凯撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
需求分析:
1、输入一行明文,使用凯撒加密方法对其加密,其中为保证加密的随机性,对Key进行随机处理。
2、对于加密后的密文,使用暴力搜索的方法对其进行解密,并调用字典对解密后的字词进行比较,自动选出正确的密匙。
例如:

先放一个不带UI界面的代码

from random import randintimport enchant
from enchant.checker import SpellChecker
import numpy as np
import string#加密
def kaisa(s, k):  # 定义函数 接受一个字符串s 和 一个偏移量klower = string.ascii_lowercase  # 小写字母upper = string.ascii_uppercase  # 大写字母before = string.ascii_letters  # 无偏移的字母顺序 小写+大写after = lower[k:] + lower[:k] + upper[k:] + upper[:k]  # 偏移后的字母顺序 还是小写+大写# 分别把小写字母和大写字母偏移后再加到一起table = ''.maketrans(before, after)  # 创建映射表return s.translate(table)  # 对s进行偏移 即加密s = input('请输入一个字符串:')k = randint(0,26) #从0-25中挑选随机一个数字当做偏移量
print(kaisa(s, k))#解密# message = input("message:")
message = kaisa(s,k)
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
true_yuju = ""
tmp = np.ones((1,26))
# print(tmp)
# 把每个可能的密钥循环一遍
message = "GUVF VF ZL FRPERG ZRFFNTR"
for key in range(len(LETTERS)):# key代表密钥# translated设为空字符串# 每次循环后清空.translated = ''# 密文里的每一个字符按顺序解密for symbol in message:if symbol in LETTERS:num = LETTERS.find(symbol) # 在26个字母里搜索到密文字符的位置num = num - key# 检查是否小于0,如果小于0,就加上26if num < 0:num = num + len(LETTERS)# 把解密之后的字符追加到translated字符串的末尾translated = translated + LETTERS[num]else:# 密文里的symbol如果不在26个字母里,就不进行解密,直接追加到字符串末尾translated = translated + symbol# 输出解密采用的key和解密后的明文print('Key #%s: %s' % (key, translated))chkr = SpellChecker("en_US")chkr.set_text(translated)for err in chkr:if(err.word == None):true_yuju = translatedelse:tmp[0][key] = 0if(tmp[0][key] == 1):true_yuju = translated
print("正确的是: ",true_yuju)

再放一个带UI界面的代码:

import tkinter
from tkinter import *
# from project1 import kaisa
from random import randint
import string
import numpy as np
from enchant.checker import SpellCheckerdef kaisa(s, k):  # 定义函数 接受一个字符串s 和 一个偏移量klower = string.ascii_lowercase  # 小写字母upper = string.ascii_uppercase  # 大写字母before = string.ascii_letters  # 无偏移的字母顺序 小写+大写after = lower[k:] + lower[:k] + upper[k:] + upper[:k]  # 偏移后的字母顺序 还是小写+大写# 分别把小写字母和大写字母偏移后再加到一起table = ''.maketrans(before, after)  # 创建映射表return s.translate(table)  # 对s进行偏移 即加密class MY_GUI():def __init__(self, init_window_name):self.init_window_name = init_window_namedef set_init_window(self):self.init_window_name.title("凯撒密码")self.init_window_name.geometry('680x500+10+10')self.init_window_name.resizable(False, False)self.init_label = Label(self.init_window_name, text = "初始字符串: ", height = 2, width = 10,anchor="w")self.init_label.grid(row = 0, column = 0)self.encipher_label = Label(self.init_window_name, text = "加密后结果: ", height = 2, width = 10,anchor="w")self.encipher_label.grid(row = 1, column = 0)self.decipher_label = Label(self.init_window_name, text = "解密后结果: ", height = 2, width = 10,anchor="w")self.decipher_label.grid(row = 2, column = 0)self.init_data_Text = Text(self.init_window_name, height =1, width = 70)# self.init_data_Text.insert(1.0, "abc")self.init_data_Text.grid(row = 0, column = 1, padx = 5, pady = 5)self.encipher_data_Text = Text(self.init_window_name, width = 70, height = 1)self.encipher_data_Text.grid(row =1, column = 1)self.decipher_data_Text = Text(self.init_window_name, width = 70, height = 30)self.decipher_data_Text.grid(row = 2, column = 1, padx = 5, pady = 5,rowspan =30)self.encipher_button = Button(self.init_window_name, text= "加密", width=10, command=self.encipher)self.encipher_button.grid(row=0, column=11)self.decipher_button = Button(self.init_window_name, text="解密", width = 10, command = self.decipher)self.decipher_button.grid(row = 2, column = 11)def encipher(self):str = self.init_data_Text.get(1.0, END)k = randint(0, 26)encipher_text = kaisa(str, k)#encipher_text = "abc"self.encipher_data_Text.insert(1.0, encipher_text)def decipher(self):message = self.encipher_data_Text.get(1.0, END)LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'true_yuju = ""tmp = np.ones((1, 26))# print(tmp)# 把每个可能的密钥循环一遍result = ""KEY = 0for key in range(len(LETTERS)):# key代表密钥# translated设为空字符串# 每次循环后清空.translated = ''# 密文里的每一个字符按顺序解密for symbol in message:if symbol in LETTERS:num = LETTERS.find(symbol)  # 在26个字母里搜索到密文字符的位置num = num - key# 检查是否小于0,如果小于0,就加上26if num < 0:num = num + len(LETTERS)# 把解密之后的字符追加到translated字符串的末尾translated = translated + LETTERS[num]else:# 密文里的symbol如果不在26个字母里,就不进行解密,直接追加到字符串末尾translated = translated + symbol# 输出解密采用的key和解密后的明文print('Key #%s: %s' % (key, translated))result += "Key #" + str(key) + ": " + str(translated)result = result.strip('\n')result += '\n'chkr = SpellChecker("en_US")chkr.set_text(translated)for err in chkr:if (err.word == None):true_yuju = translatedelse:tmp[0][key] = 0if (tmp[0][key] == 1):true_yuju = translatedKEY = keyresult += '\n' + '\n'true_yuju = "Key为: "+ str(KEY) + " 解密后的信息为: " + true_yujuresult += true_yujuself.decipher_data_Text.insert(1.0, result)def gui_start():init_window = Tk()ZMJ_PORTAL = MY_GUI(init_window)# 设置根窗口默认属性ZMJ_PORTAL.set_init_window()init_window.mainloop()  # 父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示
gui_start()

python实现凯撒密码加密与解密(暴力求解)相关推荐

  1. 5.3使用凯撒密码加密和解密英文文件python

    1本关任务:使用凯撒密码加密和解密英文文件.具体要求如下: (1)接收一个字符串为参数,如果参数值为加密,要求用户输入一个要加密的文件名,再输入一个单词做为密钥发生器,用于计算偏移量,对文件中的内容进 ...

  2. Java版 凯撒密码 加密、解密、暴力破解

    Java版 凯撒密码 加密.解密.暴力破解 用Java实现凯撒密码的 '加密' 和 '解密' 工作 代码实现如下: 代码片 package com.hellow.demo;import java.ut ...

  3. 凯撒密码加密、解密、暴力破解(C语言实现)

    C语言设计,替换密码开发设计,2022年9月信息安全课程作业分享 #include<stdio.h> #include<string.h> #include<stdlib ...

  4. python中凯撒密码加密_凯撒密码加密

    您似乎是在交互式提示中输入此代码,而不是将其保存为文件并运行它.如果是这样,那么当您使用input时,窗口将在允许您继续输入代码之前提示您输入.在plainText = input("pyt ...

  5. python中凯撒密码加密_凯撒密码加密Python

    有人能告诉我为什么我只对纯文本信息中的一个字符进行加密?消息是"船在午夜启航",加密密钥是4.我只能让t移到x,剩下的信息无法打印.我错过了什么?在#request the mes ...

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

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

  7. 运用python编写凯撒密码并实现_凯撒密码实现英文短句的加解密

    1. 将"We are students."这个英文词句用k=4的凯萨密码翻译成密码 1. 恺撒密码, 作为一种最为古老的对称加密体制,他的基本思想是: 通过把字母移动一定的位数来 ...

  8. 关于凯撒密码加密特征值,base64加密shellcode并分离绕过杀软

    什么是shellcode? 在黑客攻击中,shellcode是一小段代码,用于利用软件漏洞作为有效载荷.它之所以被称为"shellcode",是因为它通常启动一个命令shell,攻 ...

  9. python之凯撒密码及大小写字符翻转

    编写程序,凯撒密码及大小写字符翻转 1.ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串 ...

最新文章

  1. C++中关键字volatile和mutable用法
  2. yarn 切换 设置 镜像 源
  3. 数据结构(C语言实现)勘误
  4. 帮助创建未来的 .NET 客户端开发
  5. 人生苦短,我用python,为什么选择python,python简介
  6. TaskIcon 系统任务栏图标
  7. 操作系统课设之Windows 的互斥与同步
  8. NHibernate之映射文件配置说明
  9. git 查看分支_系统掌握Git之—探索.git
  10. Spark写入MySQL报错乱码+报错
  11. Luogu 4069 [SDOI2016]游戏
  12. WebStorm神器啊,一旦上手根本停不下来
  13. 容器技术Docker K8s 17 容器服务ACK基础与进阶-容器网络管理
  14. java商城的面试题,Java商城系统面试题(一)
  15. python操作cad的模块_利用python控制Autocad:pyautocad方式
  16. Minimum supported Gradle version is 6.5.1. Current version is 6.1.1.
  17. Android 编写WiFi探针,一种WiFi探针路由器的制作方法
  18. Android UI线程
  19. php单选框关联数据库字段_php select,radio和checkbox默认选择的实现方法
  20. java jcifs ntlm_Java 使用NTLM身份验证使用soap服务

热门文章

  1. python re 中文_python处理中文编码
  2. leetcode-017-297. 二叉树的序列化与反序列化
  3. 爱莫完成A+轮融资,打造基于实体零售数据引擎的Metachain Store平台
  4. 计量经济学之格兰杰因果关系检验(Granger causality test)
  5. bad_pool_caller蓝屏故障分析
  6. echarts:基于上一篇我来给大家讲讲 如果你设置了自动播放但是鼠标放上去不生效 停留时间很短 应该怎么做呢???
  7. JAVA判断数字是否在指定开闭区间内
  8. python如何控制鼠标键盘_Python如何控制鼠标键盘
  9. 使用R语言进行perMANVOA分析NMDS结果多个分组之间显著性
  10. Mapper的xml文件基础语法笔记,增删改查,遍历