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

devtools/2024/11/18 5:19:27/

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.ppmy.cn/devtools/134873.html

相关文章

某杀软环境下的添加账户

某杀软环境下的添加账户 我们在某个杀软环境下,正常添加账户一般是会被直接拦截的 白+黑 在这个环境下,白+黑是最实用的绕过方式,我们可以通过调用winapi来创建账户,这些代码再存储到dll里面&#xff0c…

SQL Server Management Studio 的JDBC驱动程序和IDEA 连接

一、数据库准备 (一)启用 TCP/IP 协议 操作入口 首先,我们要找到 SQL Server 配置管理器,操作路径为:通过 “此电脑” 右键选择 “管理”,在弹出的 “计算机管理” 窗口中,找到 “服务和应用程…

Linux解决 -bash: nc: command not found-bash: nc: 未找到命令

[rootbigdata01 ~]# nc -lk 9999 -bash: nc: command not found(-bash: nc: 未找到命令) 没有命令安装一下即可 yum install -y nc [rootbigdata01 ~]# yum install -y nc 已加载插件:fastestmirror Determining fastest mirrors * base: mi…

麒麟nginx配置

一、配置负载均衡 配置麒麟的yum源 vim /etc/yum.repos.d/kylin_aarch64.repo Copy 删除原来内容,写入如下yum源 [ks10-adv-os] name Kylin Linux Advanced Server 10 - Os baseurl http://update.cs2c.com.cn:8080/NS/V10/V10SP2/os/adv/lic/base/aarch64/ …

SpringCloud Feign 报错 Request method ‘POST‘ not supported 的解决办法

Request method POST not supportedorg.springframework.web.HttpRequestMethodNotSupportedException: Request method POST not supported解决办法: 在远程调用fegin使用GET请求时 应该附加注解 RequestParam(“pgQuery”) 实体类或者单个参数同样适用 在controller接受参数…

uniapp对接极光推送,实现消息推送功能

通过集成JG-JPush和JG-JCore插件,可以在应用中添加消息推送功能,向用户发送通知、消息等。这对于提升用户体验、增加用户粘性非常有帮助‌。 效果图: 一、登录极光官网 官网链接:portalhttps://www.jiguang.cn/console/#/home点…

躺平成长-人工智能进行编程-(12)

躺平成长: 让每一个人在科技(开源的网络/智能科技对于生活琐事的处理)的帮助下,实现养生反卷,躺平成长。 开源竞争: 当你无法彻底掌握技术的时候,你就开源这个技术,形成技术依赖&a…

elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明

前言 在使用el-table 表格中有些表格的表头需要加入一些提示&#xff0c;鼠标移入则出现提示&#xff0c;非常实用&#xff0c;我是通过el-table中的el-tooltip实现的&#xff0c;以下的效果预览 代码实现 <el-table ref"multipleTable" :data"data"…