编写一个生成凯撒密码的程序

news2024/11/18 19:43:36

plain = list(input("请输入需要加密的明文(只支持英文字母):"))

key = int(input("请输入移动的位数:"))

    

base_A = ord('A')

base_a = ord('a')

    

cipher = []

for each in plain:

    if each == ' ':

        cipher.append(' ')

    else:

        if each.isupper():

            base = base_A

        else:

            base = base_a

        cipher.append(chr((ord(each) - base + key) % 26 + base))

    

print(''.join(cipher))

 

plain = list(input("请输入需要加密的明文(只支持英文字母):"))

key = int(input("请输入移动的位数:"))

   

base_A = ord('A')

base_a = ord('a')

   

cipher = []

for each in plain:

    if each == ' ':

        cipher.append(' ')

    else:

        if each.isupper():

            base = base_A

        else:

            base = base_a

        cipher.append(chr((ord(each) - base + key) % 26 + base))

   

print(''.join(cipher))


【对关键步骤详细的解析】

在第7步之后的逻辑主要处理的是如何通过凯撒加密对字母进行位移,并且确保字母仍然保持在字母表内(即 'A'-'Z' 或 'a'-'z' 之间)。这部分的逻辑相对关键,涉及到字符的转换和加密。

### 第7步及之后的代码:

```python
else:
    if each.isupper():
        base = base_A
```

- 如果字符不是空格,首先判断它是大写字母还是小写字母。通过 `each.isupper()` 判断。
  - 如果是大写字母(如 'A', 'B', 'C' 等),`base` 被设置为 `base_A`,即 `'A'` 的 ASCII 值(65)。
  - 如果是小写字母,`base` 被设置为 `base_a`,即 `'a'` 的 ASCII 值(97)。

```python
else:
    base = base_a
```

- 如果是小写字母(如 'a', 'b', 'c' 等),则 `base` 被设置为小写字母 'a' 的 ASCII 值。

### 8. 字母加密的核心代码:

```python
cipher.append(chr((ord(each) - base + key) % 26 + base))
```

这行代码执行了加密操作。下面分步解释它的功能:

1. **获取当前字母的 ASCII 值:**  
   `ord(each)` 取出当前字符 `each` 的 ASCII 值。假设 `each = 'A'`,那么 `ord('A') = 65`。

2. **计算相对于字母表起始的偏移量:**  
   `ord(each) - base` 计算当前字母相对于字母表起始位置('A' 或 'a')的偏移量。假设当前字符是 `'A'`(并且 `base = base_A = 65`),则:
   - `ord('A') - 65 = 0`(因为 'A' 在字母表中的位置是 0)。
   
   如果当前字符是 `'B'`,则:
   - `ord('B') - 65 = 1`,表示 'B' 在字母表中的位置是 1。

3. **进行位移并确保结果在字母表范围内:**  
   `(ord(each) - base + key) % 26` 这一部分对计算得到的偏移量进行加密。加上 `key` 后,通过 `% 26` 保证偏移量不会超出 0 到 25 的范围。这里的 `26` 是字母表的长度(26 个字母)。

   - 比如 `key = 3`,并且当前字母是 `'A'`,那么:
     - 偏移量 `ord('A') - 65 = 0`
     - `(0 + 3) % 26 = 3`,结果是 3,表示字母表中的第 3 个字母('D')。

4. **将偏移后的结果转换回字母:**  
   `chr(... + base)` 将计算得到的新偏移量转回字母,并加上基准值 `base`。这个 `base` 是对应大写字母或小写字母的起始 ASCII 值,确保加密后的字母仍然在正确的字母表范围内。

   - 比如,如果计算的结果是 3(对于大写字母 'A'),那么 `chr(3 + 65) = 'D'`,即加密后的字符是 `'D'`。
   - 如果当前字母是 `'a'`,且 `key = 3`,计算过程类似,结果是 `'d'`。

### 示例说明:

#### 例子 1:大写字母加密

- 明文:`A B C D`
- 偏移量:`key = 3`

按照加密过程,我们逐个字符进行加密:

- 对于 `'A'`:
  1. `ord('A') = 65`
  2. `65 - 65 = 0`(偏移量)
  3. `(0 + 3) % 26 = 3`
  4. `chr(3 + 65) = 'D'`
  5. 所以 `'A'` 被加密为 `'D'`。

- 对于 `'B'`:
  1. `ord('B') = 66`
  2. `66 - 65 = 1`(偏移量)
  3. `(1 + 3) % 26 = 4`
  4. `chr(4 + 65) = 'E'`
  5. 所以 `'B'` 被加密为 `'E'`。

- 对于 `'C'`:
  1. `ord('C') = 67`
  2. `67 - 65 = 2`(偏移量)
  3. `(2 + 3) % 26 = 5`
  4. `chr(5 + 65) = 'F'`
  5. 所以 `'C'` 被加密为 `'F'`。

- 对于 `'D'`:
  1. `ord('D') = 68`
  2. `68 - 65 = 3`(偏移量)
  3. `(3 + 3) % 26 = 6`
  4. `chr(6 + 65) = 'G'`
  5. 所以 `'D'` 被加密为 `'G'`。

最终,加密后的密文是:`D E F G`

#### 例子 2:小写字母加密

- 明文:`a b c d`
- 偏移量:`key = 2`

逐个字符加密:

- 对于 `'a'`:
  1. `ord('a') = 97`
  2. `97 - 97 = 0`(偏移量)
  3. `(0 + 2) % 26 = 2`
  4. `chr(2 + 97) = 'c'`
  5. 所以 `'a'` 被加密为 `'c'`。

- 对于 `'b'`:
  1. `ord('b') = 98`
  2. `98 - 97 = 1`(偏移量)
  3. `(1 + 2) % 26 = 3`
  4. `chr(3 + 97) = 'd'`
  5. 所以 `'b'` 被加密为 `'d'`。

- 对于 `'c'`:
  1. `ord('c') = 99`
  2. `99 - 97 = 2`(偏移量)
  3. `(2 + 2) % 26 = 4`
  4. `chr(4 + 97) = 'e'`
  5. 所以 `'c'` 被加密为 `'e'`。

- 对于 `'d'`:
  1. `ord('d') = 100`
  2. `100 - 97 = 3`(偏移量)
  3. `(3 + 2) % 26 = 5`
  4. `chr(5 + 97) = 'f'`
  5. 所以 `'d'` 被加密为 `'f'`。

最终,加密后的密文是:`c d e f`

### 总结

1. **偏移量计算:** 每个字母的偏移量通过 `ord(each) - base` 计算,得到相对字母表的偏移。
2. **加密过程:** 通过 `(ord(each) - base + key) % 26` 保证加密后的字母仍然在字母表范围内。
3. **转换为字符:** 计算出新的偏移量后,再通过 `chr(... + base)` 将其转换为加密后的字符。

这种方法确保了大写字母和小写字母分别独立加密,同时保证字母表的循环性(例如 'Z' 加密后是 'A','z' 加密后是 'a')。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyCharm2024.2.4安装

一、官网下载 1.从下面的链接点进去 PyCharm: The Python IDE for data science and web development by JetBrains 2.进入官网后,下载pycharm安装包 3.点击下载能适配你系统的安装包 4.安装包下载完成 二、安装 1.下载完成后,打开点击右键&#xff…

【MySQL】MySQL数据库入门:构建你的数据基石

🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 🦅数据库基础🐀什么是数据库🐏主流数据库🦆MySQL数据库的基本…

基于Python 和 pyecharts 制作招聘数据可视化分析大屏

在本教程中,我们将展示如何使用 Python 和 pyecharts 库,通过对招聘数据的分析,制作一个交互式的招聘数据分析大屏。此大屏将通过不同类型的图表(如柱状图、饼图、词云图等)展示招聘行业、职位要求、薪资分布等信息。 …

OMV7 树莓派 tf卡安装

​ 升级7之后,问题多多,不是docker不行了,就是代理不好使 今天又重装了一遍,用官方的链接,重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

idea 弹窗 delete remote branch origin/develop-deploy

想删除远程分支,就选delete,仅想删除本地分支,选cancel; 在 IntelliJ IDEA 中遇到弹窗提示删除远程分支 origin/develop-deploy,这通常是在 Git 操作过程中出现的情况,可能是在执行如 git branch -d 或其他…

GitCode光引计划有奖征文大赛

一、活动介绍 GitCode平台汇聚了众多杰出的G-Star项目,它们犹如璀璨星辰,用各自的故事和成就,为后来者照亮前行的道路。我们诚邀广大开发者、项目维护者及爱好者,共同撰写并分享项目在GitCode平台上托管的体验,挖掘平…

qt移植到讯为rk3568,包含一些错误总结

qt移植到arm报错动态库找不到 error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环…

Android Framework AMS(16)进程管理

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…

(一)- DRM架构

一,DRM简介 linux内核中包含两类图形显示设备驱动框架: FB设备:Framebuffer图形显示框架; DRM:直接渲染管理器(Direct Rendering Manager),是linux目前主流的图形显示框架; 1&am…

【PHP】ThinkPHP基础

下载composer ComposerA Dependency Manager for PHPhttps://getcomposer.org/ 安装composer 查看composer是否安装 composer composer --version 安装 ThinkPHP6 如果你是第一次安装的话,首次安装咱们需要打开控制台: 进入后再通过命令,在命令行下面&a…

Elasticsearch基本概念及使用

Elasticsearch 是一个开源的、分布式的全文搜索和分析引擎,基于 Apache Lucene 构建。它提供了快速的搜索能力,支持大规模的数据分析,广泛应用于日志分析、全文搜索、监控系统和商业智能等领域。ES操作指令是基于restAPI构建,也就…

黑马智慧商城项目学习笔记

目录 智慧商城项目创建项目调整初始化目录vant组件库vant按需导入和全部导入 项目中的vw适配路由设计配置登录页静态布局图形验证码功能request模块-axios封装api模块-封装图片验证码接口 Toast轻提示(vant组件)短信验证倒计时功能登录功能响应拦截器统一…

攻防世界Web-bug

打开链接 先注册一个账号 创建成功,会给一个UID5 抓包的user值就是UID:用户名的md5加密的编码 点击Manage时要求admin用户 利用改包把user改成admin 1:admin的md5值为4b9987ccafacb8d8fc08d22bbca797ba 还要把url上的UID改为1 存在逻辑漏洞,成功越权 …

apk反编译修改教程系列-----apk应用反编译中AndroidManifest.xml详细代码释义解析 包含各种权限 代码含义【二】

💝💝💝💝在上期博文中解析了一个常规apk中 AndroidManifest.xml的权限以及代码。应粉丝需求。这次解析一个权限较高的apk。这款apk是一个家长管控的应用。需求的各种权限较高。而且通过管控端可以设置控制端的app隐藏与否。 通过博文了解💝💝💝💝 1💝💝…

湘潭大学软件工程算法设计与分析考试复习笔记(一)

文章目录 前言随机类(第七章)随机概述数值随机化舍伍德拉斯维加斯蒙特卡罗 模拟退火遗传人工神经网络 回溯(第五章)动态规划(第四章)后记 前言 考试还剩十一天,现在准备开始复习这门课了。好像全…

如何使用正则表达式验证域名

下面是一篇关于如何使用正则表达式验证域名的教程。 如何使用正则表达式验证域名 简介 域名是互联网上网站的地址,每个域名由多个标签(label)组成,标签之间用点 . 分隔。域名规则有很多细节,但基本要求是&#xff1a…

【Cesium】自定义材质,添加带有方向的滚动路线

【Cesium】自定义材质,添加带有方向的滚动路线 🍖 前言🎶一、实现过程✨二、代码展示🏀三、运行结果🏆四、知识点提示 🍖 前言 【Cesium】自定义材质,添加带有方向的滚动路线 🎶一、…

DDoS高防服务器:保障业务安全和稳定的抗攻击利器

摘要 随着网络攻击愈发频繁,尤其是DDoS(分布式拒绝服务)攻击的威胁不断增长,DDoS高防服务器成为保护企业网络安全的重要工具。本文将详细介绍DDoS高防服务器的原理、优势、应用场景及选择要点,帮助企业有效应对攻击&am…

vim配置 --> 在创建的普通用户下

在目录/etc/ 下面,有个名为vimrc 的文件,这是系统中公共的vim配置文件对所有用户都有效 我们现在创建一个普通用户 dm 创建好以后,我们退出重新链接 再切换到普通用户下 再输入密码(是不显示的,输入完后,…

Python 正则表达式使用指南

Python 正则表达式使用指南 正则表达式(Regular Expression, 简称 regex)是处理字符串和文本的强大工具。它使用特定的语法定义一组规则,通过这些规则可以对文本进行匹配、查找、替换等操作。Python 提供了 re 模块,使得正则表达…