最近作者看到了一个二战传奇故事,是咱们计算机祖师爷图灵大佬破译德军的通讯密码,最后导致二战提前两年结束,这里就简单的介绍一下恩尼格码的加密与解密
加密首先加密由原文和密码表组成,以下面的为例:
26字母表:['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] 映射表1 :['C', 'P', 'B', 'F', 'I', 'S', 'N', 'Z', 'Q', 'L', 'W', 'Y', 'J', 'O', 'H', 'U', 'A', 'V', 'E', 'R', 'T', 'K', 'D', 'M', 'X', 'G']
通过上面的两个表,我们得出了一个简单的对应关系,即:A对应Y,B对应X,即如下映射关系
{'A': 'C', 'B': 'P', 'C': 'B', 'D': 'F', 'E': 'I', 'F': 'S', 'G': 'N', 'H': 'Z', 'I': 'Q', 'J': 'L', 'K': 'W', 'L': 'Y', 'M': 'J', 'N': 'O', 'O': 'H', 'P': 'U', 'Q': 'A', 'R': 'V', 'S': 'E', 'T': 'R', 'U': 'T', 'V': 'K', 'W': 'D', 'X': 'M', 'Y': 'X', 'Z': 'G'}
假设我们现在输入原文(待加密的字符串):ABCDE
就可以得到加密后的字符串: CPBFI
import random # 生成字母表 a = [chr(ord('A') + i) for i in range(0, 26)] print(a) # 生成两个对应表,并打乱 b = a.copy() random.shuffle(b) print(b) # 建立对应密码表 dict1 = dict(zip(a, b)) print(dict1) word = "ABCDE" print("加密前: " + word) mm = "" for i in range(len(word)): mm += dict1[word[i]] print("加密后: " + mm)上面仅仅是一个小小的Demo,且经过一张表的加密并不安全,可以通过26个字母出现的频率来反推其原文,所以可以使用两张或者多张表来进行混合加密,以下用双映射表为例:
26字母表:['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] 映射表1: ['C', 'P', 'B', 'F', 'I', 'S', 'N', 'Z', 'Q', 'L', 'W', 'Y', 'J', 'O', 'H', 'U', 'A', 'V', 'E', 'R', 'T', 'K', 'D', 'M', 'X', 'G'] 映射表2: ['G', 'N', 'U', 'J', 'M', 'I', 'Z', 'X', 'E', 'Y', 'B', 'K', 'A', 'P', 'D', 'R', 'O', 'H', 'C', 'F', 'W', 'V', 'L', 'T', 'Q', 'S']
映射关系如下:
{'A': 'C', 'B': 'P', 'C': 'B', 'D': 'F', 'E': 'I', 'F': 'S', 'G': 'N', 'H': 'Z', 'I': 'Q', 'J': 'L', 'K': 'W', 'L': 'Y', 'M': 'J', 'N': 'O', 'O': 'H', 'P': 'U', 'Q': 'A', 'R': 'V', 'S': 'E', 'T': 'R', 'U': 'T', 'V': 'K', 'W': 'D', 'X': 'M', 'Y': 'X', 'Z': 'G'} {'A': 'G', 'B': 'N', 'C': 'U', 'D': 'J', 'E': 'M', 'F': 'I', 'G': 'Z', 'H': 'X', 'I': 'E', 'J': 'Y', 'K': 'B', 'L': 'K', 'M': 'A', 'N': 'P', 'O': 'D', 'P': 'R', 'Q': 'O', 'R': 'H', 'S': 'C', 'T': 'F', 'U': 'W', 'V': 'V', 'W': 'L', 'X': 'T', 'Y': 'Q', 'Z': 'S'}
还是输入:ABCED
得到结果: CNBJI
此次加密我们使用了双表混合法,即第一个字符是使用第一个映射表加密,第二个字符使用第二张映射表来进行加密,这可以使加密的安全度提高很多,使信息更加安全
将上面的映射表反转之后如下:
{'C': 'A', 'P': 'B', 'B': 'C', 'F': 'D', 'I': 'E', 'S': 'F', 'N': 'G', 'Z': 'H', 'Q': 'I', 'L': 'J', 'W': 'K', 'Y': 'L', 'J': 'M', 'O': 'N', 'H': 'O', 'U': 'P', 'A': 'Q', 'V': 'R', 'E': 'S', 'R': 'T', 'T': 'U', 'K': 'V', 'D': 'W', 'M': 'X', 'X': 'Y', 'G': 'Z'} {'G': 'A', 'N': 'B', 'U': 'C', 'J': 'D', 'M': 'E', 'I': 'F', 'Z': 'G', 'X': 'H', 'E': 'I', 'Y': 'J', 'B': 'K', 'K': 'L', 'A': 'M', 'P': 'N', 'D': 'O', 'R': 'P', 'O': 'Q', 'H': 'R', 'C': 'S', 'F': 'T', 'W': 'U', 'V': 'V', 'L': 'W', 'T': 'X', 'Q': 'Y', 'S': 'Z'}
然后将加密后的:CNBJI 代入得到结果: ABCDE
代码如下:import random # 生成字母表 a = [chr(ord('A') + i) for i in range(0, 26)] print(a) # 生成两个对应表,并打乱 b = a.copy() random.shuffle(b) print(b) c = a.copy() random.shuffle(c) print(c) # 建立对应密码表 dict1 = dict(zip(a, b)) dict2 = dict(zip(a, c)) print(dict1) print(dict2) word = "ABCDE" print("加密前: " + word) mm = "" for i in range(len(word)): if i % 2 == 0: mm += dict1[word[i]] else: mm += dict2[word[i]] print("加密后: " + mm) dict3 = dict(zip(dict1.values(), dict1.keys())) dict4 = dict(zip(dict2.values(), dict2.keys())) print(dict3) print(dict4) word = "" for i in range(len(mm)): if i % 2 == 0: word += dict3[mm[i]] else: word += dict4[mm[i]] print("明文是: " + word)
进过上面的学习,你知道了恩尼格码密码机加密与解密规则了吗?如果知道了请给作者一个大大的赞,您的支持就是作者更新的最大动力
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)