设计思想

Enigma机的机械结构:
  • 键盘:加密人员通过键盘进行输入

  • 转子:Enigma机上一般装有至少3个转轮。每个转轮有代表26个字母的触头和触点,触点和触头在转轮内部有导线相连(一个转轮相当于一组单表代替密码),同时外部有棘轮控制转动的幅度。当按动键盘上的单键时,最右边的转轮就会转动一次,每转动26次就会发生进位,带动下一个轮转动。每当转轮转动暂停下来,转轮的触头就会和下一个转轮的触点重新接触,构成通路,按动单键产生的电信号就会经过三个转轮(转轮的触头和下一个转轮的触点有26种接触可能,就是26种通路可能,也就是26张单表)。

  • 反射板:从最后一个转轮出来的电信号会经过反射板,反射板会对信号再次进行置换,接着反射回去,让其再次通过三个转轮,随后输出。

  • 显示板:输出的字母会在显示板上展现,随后会另有机器打印记录。

  • 连接板:设置在机器底部,可以将一对字母短接,相当于是单表加密。

实现的关键:
  • 转子作为单表代替密码,可采用随机代替的方式实现。
  • 反射器是设计关键,需要保证\(D(a) = b, \quad D(b) = a\),即\(D(D(x))=x\)。
  • 转子转动规则为26进1.

python实现

import random
from copy import copy
reflector=[18, 16, 12, 15, 19, 13, 23, 20, 9, 8, 21, 14, 2, 5, 11, 3, 1, 22, 0, 4, 7, 10, 17, 6, 25, 24]
raw_cog=[[6, 10, 23, 9, 19, 2, 21, 1, 7, 24, 0, 17, 15, 3, 8, 4, 14, 12, 16, 25, 11, 18, 22, 20, 13, 5]
,[0, 7, 1, 10, 19, 5, 9, 18, 4, 23, 2, 20, 15, 24, 22, 8, 12, 25, 6, 13, 3, 11, 21, 17, 16, 14]
,[23, 2, 4, 13, 14, 21, 12, 0, 9, 16, 5, 17, 20, 22, 10, 24, 7, 3, 25, 8, 15, 6, 19, 18, 11, 1]] def shift(List,n):
return List[n:]+List[:n] class Cog:#模拟转子
def __init__(self,temp):
self.cog=copy(temp)
def rotate(self):
#self.cog=self.cog[1:]+self.cog[:1]
self.cog=shift(self.cog,1)
def printStatus(self):#输出转子当前的状态
for i in self.cog:
print i,
def nextNum(self,x):
return self.cog[x]
def lastNum(self,x):
return self.cog.index(x) class Enigma:
def __init__(self,cogSum):#cogSum是要使用的转子数
global reflector
self.lenCipher=0 #记录密文长度,计算转子转动
self.cogSum=cogSum
self.cogList=[] #所有使用的转子list
self.reflector=copy(reflector) #反射器
for i in range(0,cogSum):
self.cogList.append(Cog(raw_cog[i]))
def printStatus(self):#输出Enigma密码机当前的状态
for i in range(0,self.cogSum):
print 'cog'+str(self.cogSum)+': '
self.cogList[i].printStatus()
print
print 'reflector:',
for i in self.reflector:
print i,
def dealChar(self,c):#加密一个字符,并且转动转子
#加密字符
num=ord(c)-ord('a')
for i in range(0,self.cogSum):
num=self.cogList[i].nextNum(num)
num=self.reflector[num]
for i in range(self.cogSum-1,-1,-1):
num=self.cogList[i].lastNum(num)
#转动转子
for i in range(0,self.cogSum):
if 26**i<=self.lenCipher and self.lenCipher%26**i==0:
self.cogList[i].rotate()
return chr(ord('a')+num)
def encode(self,oriStr):#字符串的加密,只处理小写英文字母,忽略其他字符
ciphertext=''
oriStr=oriStr.lower()
for eachChar in oriStr:
if eachChar.isalpha():
self.lenCipher+=1
ciphertext+=self.dealChar(eachChar)
return ciphertext def main():
sumcog=input('请输入要使用的转子数目(最多3个):')
for i in range(0,sumcog):
print '请输入一个0-25的数字以确定第'+str(i+1)+'一个转子起始位置:'
c1=input()
raw_cog[i]=shift(raw_cog[i],c1) #调整转子的初始位子 rawString=raw_input('请输入要加密的字符串')
test=Enigma(sumcog)
temp=test.encode(rawString)
print temp if __name__ == '__main__':
main()

测试

输入相同字符串:aaaaa,加密后得到zjfns;
再次使用相同设置加密zjfns,得到原字符串aaaaa。

Enigma模拟-Python的更多相关文章

  1. Mock实现模拟python的对象

    Mock库的应用 Mock在Python3.3之前是第三方库,需要安装 pip install Mock :导入 import mock Mock在Python3.3之后是Python标准库,导入方式 ...

  2. OpenAI 开源机器人模拟 Python 库,并行模拟处理速度提升400%

    10000da.cnvboyule.cnjiaeidaypt.cn  在过去一年的研究中,OpenAI团队开源一个使用 MuJoCoengine开发的用于机器人模拟的高性能Python库.雷锋网了解到 ...

  3. 双摆模拟 python(转)

    双摆 是 混沌理论 中的一个常见示例,这里通过 python 的作图工具包Matplotlib 来模拟双摆的运动过程: 注意:在 vs2017 中可以正确运行程序,在 cmd 环境下有时报错 &quo ...

  4. [ZOJ 1009] Enigma (模拟)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1009 题目大意:给你三个转换轮,只有当第一个转换轮转动一圈后第二 ...

  5. 模拟python中的Yield伪并发

    并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. #Yield伪并发 _author_= ...

  6. C++模拟python风格的print函数--打印vector,map,list等结构

    // 最基本实现 template<typename T> static void print(T t) { std::cout << t; } // 处理 std::pair ...

  7. Python 的mock模拟测试介绍

    如何不靠耐心测试 可能我们正在写一个社交软件并且想测试一下"发布到Facebook的功能",但是我们不希望每次运行测试集的时候都发布到Facebook上. Python的unitt ...

  8. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  9. CoffeeScript实现Python装潢器

    在上篇Angular遇上CoffeeScript – NgComponent封装中,我们讲述了CoffeeScript这门小巧的语言,摒弃JavaScript中糟粕(“坑”)部分,并将JavaScri ...

随机推荐

  1. iis常见问题解决

    iis7以上版本部署4.0框架项目常见问题解决 配置错误: 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的 (overrideModeDefault=&quo ...

  2. Shiro身份认证---转

    目录 1. Shro的概念 2. Shiro的简单身份认证实现 3. Shiro与spring对身份认证的实现 前言: Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境 ...

  3. wiredtiger存储引擎介绍——本质就是LSM,当然里面也可以包含btree和列存储

    见:http://www.slideshare.net/profyclub_ru/4-understanding-and-tuning-wired-tiger-the-new-high-perform ...

  4. ES查看segment大小

    摘自:http://www.aboutyun.com/thread-17078-1-1.html Segment Memory Segment不是file吗?segment memory又是什么?前面 ...

  5. Linux_笔记_01_设置静态IP与 SecureCRT连接Linux

    步骤一至三,即可设置好静态IP 步骤四至九,使SecureCRT连接Linux 步骤一:编辑ifcfg-eth0 文件 1.打开ifcfg-eth0 文件 使用命令:vi /etc/sysconfig ...

  6. 【转】C++11 标准新特性:Defaulted 和 Deleted 函数

    原文链接http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/ 本文将介绍 C++11 标准的两个新特性:defaul ...

  7. 幻想乡三连A:五颜六色的幻想乡

    非常直接地构造 由于答案与生成树计数有关,所以一定要使用矩阵树定理,但这样就不能限制每种颜色的便使用的数量 我们构造$N^2$个关于$Ans_{x,y}$的方程,枚举将红色的边拆成$x$条,将蓝色的边 ...

  8. SPOJ375Query on a tree I(树剖+线段树)(询问边)

    ιYou are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  9. 2017.10.6北京清北综合强化班DAY6

    题目大意:改变一个数的位置 把一个序列变成不下降序列 题解: 设置一个pre,如果破坏单调性,就把‘删除’这个.否则把pre修改为当前元素的值. 考试时这样得了90分,是因为我的做法只能过这样的数据 ...

  10. hdu 1724 Ellipse —— 自适应辛普森积分

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1724 函数都给出来了,可以用辛普森积分: 一开始 eps = 1e-8 TLE了,答案只要三位小数,那么 ...