Python 实现凯撒加解密

您所在的位置:网站首页 用python编写凯撒密码 Python 实现凯撒加解密

Python 实现凯撒加解密

2024-07-16 19:19:07| 来源: 网络整理| 查看: 265

实现凯撒加密 凯撒加密(Ceaser Cipher)第一种实现(加减法运算)1. 加密库自定义加密规则获取明文程序主体 代码总汇2. 解密 第二种实现(取模运算及零下索引)1. 加密2. 解密

凯撒加密(Ceaser Cipher)

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

上述内容引用自百度百科

对于凯撒密码来说,多次加密的效果与一次加密的效果类似,并没有提高加密的效果。在一个凯撒密码的密码体系中,往往存在一个特别的偏移量,使用这个偏移量对明文加密两次将得到明文。 第一种实现(加减法运算) 1. 加密 库

在两种实现方式中,都需要使用到 Python 第三方库 pyperclip。 在命令行中通过 PIP 工具使用如下命令进行安装:

pip install pyperclip

pyperclip 第三方库允许你获取剪贴板中的内容以及向剪贴板中添加内容,这两个功能分别可以通过 pyperclip 库中的函数 paste() 以及 copy() 函数实现。 由于在解密过程中,密文往往是通过文本文件或是通过复制粘贴的方式来输入程序中的,所以在本程序中,我们将导入 pyperclip 第三方库。

import pyperclip 自定义加密规则 # 定义凯撒加密的偏移量 OFFSET = 13 # 定义加解密过程中的所使用的字符集,密文中的字符 # 必须包含其中,否则无法正常加密 CHAR_SET = ''.join([chr(i) for i in range(32, 127)])

注: 传递给 join() 方法中的序列参数中不能包含数值型元素,例如包含数字的列表。否则 Python 解释器将抛出如下错误:

TypeError: sequence item 0: expected str instance, int found

ASCII 可见字符表 上述图片引用自 菜鸟教程

我们构建了列表 CHAR_SET ,通过对列表元素的索引进行加法运算来实现字符在 ASCII 码表的子集 CHAR_SET 中的偏移。 打印 CHAR_SET 变量中的内容,我们将得到如下结果: CHAR_SET

获取明文 plain_text = cipher_text = pyperclip.paste() 程序主体 length = len(CHAR_SET) right = length - 1 cipher_text = '' for char in plain_text: idx = CHAR_SET.find(char) if idx != -1: tmp = idx + OFFSET # 如果索引偏移后的值比列表 CHAR_SET 的 # 最后一位元素的索引还要大, # 那么 Python 解释器将执行循环体中的内容 while tmp > right: tmp -= length cipher_text += CHAR_SET[tmp] else: print('【程序获取到的明文不符合加密规则,\ 明文如下,请仔细检查后重新运行程序】') print(plain_text) break pyperclip.copy(cipher) print('【程序已将加密结果复制到了您的剪贴板,请注意查收】') print(cipher_text)

注:

str.find(substring, beg=0, end=len(string)) find() 方法可以返回子字符串 substring 的第一个元素在 字符串 str 中第一次出现的索引位置,若 substring 不存在于 str 中,该方法将返回 -1。str.index(substring, beg=0, end=len(string)) 该方法的作用效果及使用方法与 str.find() 方法类似,唯一不同的是,在 substring 不存在与 str 中时,该方法将抛出如下错误:

ValueError: substring not found

为保证程序的稳定执行,在使用该方法前,理应先判断 substring 是否存在于 str 中,若存在则使用该方法。 也可以通过 try…except 语句捕获错误,避免程序崩溃。

代码总汇 import pyperclip # 获取明文 plain_text = pyperclip.paste() # 定义凯撒加密的偏移量 OFFSET = 13 # 定义加解密过程中的所使用的字符集,密文中的字符 # 必须包含其中,否则无法正常加密 CHAR_SET = ''.join([chr(i) for i in range(32, 127)]) # 自定义解密规则 length = len(CHAR_SET) right = length - 1 cipher_text = '' for char in plain_text: idx = CHAR_SET.find(char) if idx != -1: tmp = idx + OFFSET # 如果索引偏移后的值比列表 CHAR_SET 的 # 最后一位元素的索引还要大, # 那么 Python 解释器将执行循环体中的内容 while tmp > right: tmp -= length cipher_text += CHAR_SET[tmp] else: print('【程序获取到的明文不符合加密规则,\ 明文如下,请仔细检查后重新运行程序】') print(plain_text) break pyperclip.copy(cipher_text) print('【程序已将加密结果复制到了您的剪贴板,请注意查收】') print(cipher_text) 2. 解密

凯撒密码相对较为简单,解密运算即加密运算的逆运算,与前文讲解的加密算法无太大区别,故将直接给出源代码:

import pyperclip # 获取密文 cipher_text = pyperclip.paste() # 定义凯撒加密的偏移量 OFFSET = 13 # 定义加解密过程中的所使用的字符集,密文中的字符 # 必须包含其中,否则无法正常解密 CHAR_SET = ''.join([chr(i) for i in range(32, 127)]) # 自定义解密规则 length = len(CHAR_SET) left = 0 plain_text = '' for char in cipher_text: idx = CHAR_SET.find(char) if idx != -1: tmp = idx - OFFSET # 如果索引偏移后的值比列表 CHAR_SET 的 # 最后一位元素的索引还要大, # 那么 Python 解释器将执行循环体中的内容 while tmp right: tmp -= length

类似的操作我们往往可以使用求模运算来替代:

tmp %= length

虽然两者的底层实现都是类似的,但使用求模运算将提升程序的可读性,所以还是推荐各位尽量使用第二种。

2. 解密

解密的 “零下索引” 实现,其实就是将绝对值不超过一定范围(CHAR_SET 的列表长度)的负数直接作为索引求得偏移后的字符,但这可能需要对超出范围的绝对值做减法运算,所以这种实现并不比第一种要好,无论是可读性还是性能上来讲。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭