实验5 凯撒加密算法原理与实现

实验内容:

        凯撒加密算法的原理是,把明文中每个英文字母替换为该字母在字母表中后面第k个字母,如果后面第k个字符超出字母表的范围,则把字母表首尾相接,也就是字母Z的下一个字母是A,字母z的下一个字母是a。要求明文中的大写字母和小写字母分别进行处理,大写字母加密后仍为大写字母,小写字母加密后仍为小写字母。

        凯撒加密算法是一种经典加密算法,虽然抗攻击能力非常弱,现在也没有很好的应用价值了,但其中的思路还是值得借鉴的。

        编写程序,输入一个字符串作为待加密的明文,然后输入一个整数作为凯撒加密算法的密钥,最后输出该字符串使用该密钥加密后的结果。

实验内容详细解释

整体解释


这段Python代码实现了一个凯撒密码加密函数。凯撒密码是一种古老的加密方法,它通过将字母表中的每个字母按照一定的数目(密钥)进行偏移来加密信息。以下是对代码的解释:
1. `import string`:导入Python标准库中的`string`模块,该模块包含了一系列关于字符串的常量。
2. `def kaisa(s, k)`:定义了一个名为`kaisa`的函数,它接受两个参数:字符串`s`和整数`k`。`s`是要加密的字符串,`k`是密钥,表示字母偏移的位数。
3. `lower = string.ascii_lowercase`:获取所有小写字母的字符串。
4. `upper = string.ascii_uppercase`:获取所有大写字母的字符串。
5. `before = string.ascii_letters`:获取所有大小写字母的字符串。
6. `after = lower[k:] + lower[:k] + upper[k:] + upper[:k]`:创建一个新的字符串,这个字符串是通过对原始字母表进行偏移得到的。小写字母和大写字母分别偏移`k`位。
7. `table = ''.maketrans(before, after)`:创建一个转换表,用于将原始字母映射到偏移后的字母。
8. `return s.translate(table)`:使用创建的转换表对输入的字符串`s`进行转换,并返回加密后的结果。
9. `s = input('请输入一个字符串:')`:提示用户输入要加密的字符串。
10. `k = int(input('请输入一个整数密钥:'))`:提示用户输入密钥,并将其转换为整数。
11. `print(kaisa(s, k))`:调用`kaisa`函数,并打印加密后的结果。
例如,如果用户输入字符串`"hello"`和密钥`3`,那么输出将会是`"khoor"`,因为每个字母都向前移动了3位。
 

详细问题1

在表达式 `after = lower[k:] + lower[:k] + upper[k:] + upper[:k]` 中,偏移的步骤具体如下:
1. **获取小写字母和大写字母的完整列表**:
   - `lower` 是一个包含所有小写ASCII字母的字符串,即 'abcdefghijklmnopqrstuvwxyz'。
   - `upper` 是一个包含所有大写ASCII字母的字符串,即 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'。
2. **对原始字母表进行偏移**:
   - `lower[k:]`:这个切片操作从字符串 `lower` 的第 `k` 个位置开始,直到字符串的末尾。这表示取出了从第 `k` 个小写字母到 'z' 的所有字母。
   - `lower[:k]`:这个切片操作从字符串 `lower` 的开始位置到第 `k` 个位置之前(不包括第 `k` 个字母)。这表示取出了从 'a' 到第 `k-1` 个小写字母的所有字母。
3. **拼接偏移后的字母表**:
   - 将 `lower[k:]` 和 `lower[:k]` 连接起来,就实现了小写字母的偏移。原来在 `lower` 中前 `k` 个位置的字母现在被移到了字符串的末尾。
   - 同样地,`upper[k:]` 和 `upper[:k]` 也分别表示大写字母的偏移。
4. **形成新的偏移字母表**:
   - `lower[k:] + lower[:k]`:这个表达式将 `lower` 字母表的前 `k` 个字母移动到末尾,形成新的小写字母表。
   - `upper[k:] + upper[:k]`:这个表达式将 `upper` 字母表的前 `k` 个字母移动到末尾,形成新的大写字母表。
5. **组合偏移后的字母表**:
   - `after = lower[k:] + lower[:k] + upper[k:] + upper[:k]`:这个表达式将偏移后的小写字母和大写字母拼接在一起,形成了一个新的字符串,这个字符串包含了偏移后的所有字母。
假设 `k` 是 3,那么这个过程如下所示:
- 原始小写字母表:`abcde...xyz`
- 偏移后的小写字母表:`defgh...xyzabc`
- 原始大写字母表:`ABCDE...XYZ`
- 偏移后的大写字母表:`DEFGH...XYZABC`
最终,`after` 变量将包含以下字符串:
`'defghijklmnopqrstuvwxyzabcDEFGHIJKLMNOPQRSTUVWXYZABC'`
这个新的字符串就是通过偏移原始字母表得到的,可以用来进行凯撒密码加密。
 

详细问题2

在Python中,字符串的`.maketrans()`方法和`.translate()`方法经常一起使用来进行字符替换,例如在加密算法中。以下是引用内容的解释:
1. `able = ''.maketrans(before, after)`:
   - `.maketrans()` 是一个字符串方法,它创建并返回一个转换表(translation table),这个转换表是一个字典,它将一个字符映射到另一个字符。
   - `before` 是一个包含原始字符的字符串,在这个上下文中,它是由小写字母和大写字母组成的字符串,即 `string.ascii_letters`。
   - `after` 是一个包含偏移后字符的字符串,这是通过前面提到的步骤 `lower[k:] + lower[:k] + upper[k:] + upper[:k]` 创建的。
   - `.maketrans()` 方法将 `before` 中的每个字符映射到 `after` 中相应位置的字符。因此,如果 `before` 是 `'abc'` 而 `after` 是 `'def'`,那么转换表将 `'a'` 映射到 `'d'`,将 `'b'` 映射到 `'e'`,将 `'c'` 映射到 `'f'`。
2. `return s.translate(table)`:
   - `.translate()` 是一个字符串方法,它使用转换表来替换字符串中的字符。
   - `s` 是输入的原始字符串,即用户想要加密的字符串。
   - `table` 是前面通过 `.maketrans()` 创建的转换表。
   - 当 `.translate()` 方法被调用时,它会遍历字符串 `s` 中的每个字符,并在转换表中查找该字符。如果找到了匹配项,该字符就会被转换表中的映射字符替换。如果字符在转换表中没有对应的映射,它将保持不变。
   - 最终,`.translate()` 方法返回一个新字符串,其中所有可以映射的字符都被替换成了它们在转换表中的对应字符。
结合上述两点,整个加密过程是这样的:首先,创建一个转换表,将原始的字母映射到经过偏移的字母。然后,使用这个转换表对用户输入的字符串进行转换,得到加密后的字符串并返回。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值