python-恩尼格码密码机实现

python-恩尼格码密码机实现,第1张

python-恩尼格码密码机实现 原由

最近作者看到了一个二战传奇故事,是咱们计算机祖师爷图灵大佬破译德军的通讯密码,最后导致二战提前两年结束,这里就简单的介绍一下恩尼格码的加密与解密

加密

首先加密由原文和密码表组成,以下面的为例:

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)

进过上面的学习,你知道了恩尼格码密码机加密与解密规则了吗?如果知道了请给作者一个大大的赞,您的支持就是作者更新的最大动力

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5578831.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存