南邮密码学实验:转轮密码机

这篇博客介绍了南邮密码学实验中的转轮密码机,涉及现代密码学教程第2版的一个练习。博主通过解释题目要求,提出使用面向对象编程的思想来解决该问题。代码部分展示了C++实现的转轮密码机,确保输入的字母能正确转换,并且在遇到非字母字符时保持原样输出。

南邮密码学实验:转轮密码机

题目

现代密码学教程第2版[谷利泽,郑世慧,杨义先编著]2015年版
3.2.3(P53~55)
P53
P54
在这里插入图片描述

解释

输入一个字母
根据对应的慢轮子、中轮子、快轮子的对应的变换,
输出另一个字母
每输入一个,慢轮子下转一格,
慢轮子转一圈之后,中轮子下转一格,
中轮子下转一圈,快轮子下转一格

想法

1、对于这个轮子来说,他的属性是固定的,也就是输入、输出,行为也是固定的,就左右数字匹配、旋转
所以觉得用面向对象方便些
这题面向编程的写法我朋友写了,看上去有点麻烦:

2、然后我稍微加了点,确保稳定性:若读取小写字母,变为大写字母,若读取非字母,直接输出
3、当然这题用Python应该更好写一点,不过C++都写出来了,Python重构下应该也不费事(

代码(C++)

#inclu
### 电大学密码学中的转轮密码机原理 #### 1. 转轮密码机构成与工作方式 转轮密码机由多个转轮组成,每个转轮上标记着不同的字符集。对于三个转轮的情况,编号分别为1、2和3。每当第一个转轮完成一次完整的循环(即经过全部26个字母),第二个转轮会前进一位;同样地,在第二转轮也完成了其一轮回之后,第三个转轮才会移动一格[^1]。 这种制意味着整个系统的周期长度等于各个独立组件周期乘积的结果——在这个例子中就是\(26^{3}=17576\)次迭代才能使所有部件回到原始状态。这样的设计增加了破译难度,因为即使知道部分参数也无法轻易预测后续变化规律。 #### 2. 加密过程描述 在加密过程中,原文本按照一定规则映射到新的字符序列上去形成密文。具体来说: - 将待加密的信息逐一分割成单独的字符; - 对每一个字符应用上述提到过的多层替换逻辑来获取对应的替代符号; - 这些操作依赖于当前各层转盘的具体位置以及预设好的转换表格来进行计算得出最终结果[^4]。 #### 3. 解密方法概述 为了能够正确还原已加密的数据,接收者需要拥有同样的设备配置并保持同步的状态。解密的过程基本上是对加密步骤的一种逆向执行: - 把接收到的秘密信息分解开来考虑; - 针对每一段采用一致的方式去反推原本应有的表现形式; - 使用相匹配的设定值作为基础条件从而获得准确无误的答案。 ```python def decrypt_message(ciphertext, initial_positions): alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' wheels = [ list(alphabet), # Fastest rotating wheel (innermost) list(alphabet[::-1]), # Middle speed rotating wheel list(alphabet) # Slowest rotating wheel (outermost) ] plaintext = '' positions = list(initial_positions) for char in ciphertext.upper(): if not char.isalpha(): continue shifts = [] # Calculate shift based on current position of each wheel for i in range(len(positions)): index = ord(char)-ord('A') shifted_index = (index - positions[i]) % 26 new_char = wheels[i][shifted_index] shifts.append(shifted_index) char = new_char # Update the position after processing one character update_wheel_positions(positions) plaintext += char return plaintext def update_wheel_positions(positions): carry_over = True for i in reversed(range(len(positions))): if carry_over: positions[i] = (positions[i]+1)%26 carry_over = False if positions[i]!=0 else True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值