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

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_Aelse:base = base_acipher.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.rhkb.cn/news/473667.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)

RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整,全面重新设计业务逻辑代码,代码量减少一半以上,开发更加高效。全系统引入全新字体图标,整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar,让开发更加…

华为USG5500防火墙配置NAT

实验要求: 1.按照拓扑图部署网络环境,使用USG5500防火墙,将防火墙接口加入相应的区域,添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip,使trust区域…

Java基础-I/O流

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 字节流 定义 说明 InputStream与OutputStream示意图 说明 InputStream的常用方法 说明 OutputStrea…

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)

上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.(只演⽰部分常⽤的⼯作模式) 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …

<项目代码>YOLOv8 番茄识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

Python数据分析NumPy和pandas(三十五、时间序列数据基础)

时间序列数据是许多不同领域的结构化数据的重要形式,例如金融、经济、生态学、神经科学和物理学。在许多时间点重复记录的任何内容都会形成一个时间序列。许多时间序列是固定频率的,也就是说,数据点根据某些规则定期出现,例如每 1…

【C++滑动窗口】1248. 统计「优美子数组」|1623

本文涉及的基础知识点 C算法:滑动窗口及双指针总结 LeetCode1248. 统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数…

【不写for循环】玩玩行列

利用numpy的并行操作可以比纯用Python的list快很多,不仅如此,代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作,少写几个for循环()。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…

《Java核心技术 卷I》用户界面中首选项API

首选项API 在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点: 有些操作系统没有主目录概念,很难为匹配文件找到…

3步实现贪吃蛇

方法很简单,打开页面,复制,粘贴 一.整体思维架构 我们根据游戏的开始,运行,结束,将整个游戏划分成三个部分。在每个部分下面又划分出多个功能,接下来我们就根据模块一一实现功能。 二.Gamesta…

STL序列式容器之list

相较于vector的连续性空间&#xff0c;list相对比较复杂&#xff1b;list内部使用了双向环形链表的方式对数据进行存储&#xff1b;list在增加元素时&#xff0c;采用了精准的方式分配一片空间对数据及附加指针等信息进行存储&#xff1b; list节点定义如下 template<clas…

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看

文献&#xff1a;蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…

(一)- DRM架构

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

Java基础-Java中的常用类(上)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 String类 创建字符串 字符串长度 连接字符串 创建格式化字符串 String 方法 System类 常用方法 方…

Istio分布式链路监控搭建:Jaeger与Zipkin

分布式追踪定义 分布式追踪是一种用来跟踪分布式系统中请求的方法&#xff0c;它可以帮助用户更好地理解、控制和优化分布式系统。分布式追踪中用到了两个概念&#xff1a;TraceID 和 SpanID。 TraceID 是一个全局唯一的 ID&#xff0c;用来标识一个请求的追踪信息。一个请求…

探索Python网络请求新纪元:httpx库的崛起

文章目录 **探索Python网络请求新纪元&#xff1a;httpx库的崛起**第一部分&#xff1a;背景介绍第二部分&#xff1a;httpx库是什么&#xff1f;第三部分&#xff1a;如何安装httpx库&#xff1f;第四部分&#xff1a;简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…

vue使用List.reduce实现统计

需要对集合的某些元素的值进行计算时&#xff0c;可以在计算属性中使用forEach方法 1.语法&#xff1a;集合.reduce ( ( 定义阶段性累加后的结果 , 定义遍历的每一项 ) > 定义每一项求和逻辑执行后的返回结果 , 定义起始值 ) 2、简单使用场景&#xff1a;例如下面…

层归一化和批归一化

层归一化是针对某一样本的所有特征&#xff0c;批归一化是针对所有样本的某一特征。 计算公式&#xff1a;&#xff08;当前值 - 均值&#xff09;/ 标准差。 作用&#xff1a;缓解梯度消失和梯度爆炸的问题&#xff0c;并提高网络的泛化性能。 为什么Transform和BERT中使用层归…

vueRouter路由切换时实现页面子元素动画效果, 左右两侧滑入滑出效果

说明 vue路由切换时&#xff0c;当前页面左侧和右侧容器分别从两侧滑出&#xff0c;新页面左右分别从两侧滑入 效果展示 路由切换-滑入滑出效果 难点和踩坑 现路由和新路由始终存在一个页面根容器&#xff0c;通过<transition>组件&#xff0c;效果只能对页面根容器有效…

docker 安装之 windows安装

文章目录 1: 在Windows安装Docker报19044版本错误的时候&#xff0c;请大家下载4.24.1之前的版本&#xff08;含4.24.1&#xff09;2: Desktop-WSL kernel version too low3: docker-compose 安装 (v2.21.0)4: 配置镜像源 1: 在Windows安装Docker报19044版本错误的时候&#xf…