上文讲的古典加密算法虽然很简单,但是在密码史上是使用最久的加密方式。历史上由于算力有限,加上有学识的人有限,所以直到概率论出现后,古典密码才开始破防。归根结底,英文单词中字母出现的频率是不同的,e以12.702%的百分比占比最高,z只占到0.074%,感兴趣的同学可以去百科查字母频率详细统计数据。如果密文数量足够大,仅仅采用频度分析法就可以破解。如果再加上现代计算机强大的算力,凯撒加密算法更是不堪一击。

后续人类不断改进,在二战时期涌现了新的思路与算法。恩尼格玛机就是二战时期纳粹德国使用的加密机器,非常经典,并且难以破译。英国集全国之力进行破译,参与破译的人员有被称为计算机科学之父、人工智能之父的图灵。恩尼格玛机使用的加密方式本质上还是移位和替代,只不过因为密码表种类极多,破解难度高,同时加密解密机器化,使用便捷。恩尼格玛机共有26个字母键和26个带有字母的小灯泡,当按下键盘上的键时,加密后的密文字母所对应的小灯泡就会亮起来,依次记录密文发送给接收者就实现了密文传输。接收者也用相同的恩尼格玛机,依次输入密文并获取原文。密码机内装有“转子”装置,每按下键盘上的一个字母,“转子”就会自动地转动一个位置,相当于更换了一套密码表。最开始“转子”只有6格,相当于有6套密码表,后来升级到了26格,即有26套密码表。后来恩尼格玛机由一个“转子”升级到了多个“转子”,是密码表套数成指数级增长。最高水准恩尼格玛机具有8个“转子”,密码表套数为26的8次方,达到了2000多亿种。此时靠人工进行破译就不太可能了,国内某抗日神剧中一个数学美女天才,靠几张纸就破译了真的只能是呵呵了。电影《模仿游戏》较为真实得复现了破解方法,就是采用了类似现代计算机的机械机器进行快速运算。

现代经典密码学针对加解密问题,发展出几个大的方向:

本文将简单介绍对称加密的python实现。先谈主要的对称加密算法,主要有以下几类:

对称密钥能够广泛用于:

# pip install cryptography
from cryptography.fernet import Fernet
# 生成对称密钥
key = Fernet.generate_key()
print(key)
# 用密钥加密
coder = Fernet(key)
crymsg = coder.encrypt(b'what are you doing?')
print(crymsg)
# 用密钥解密
plaintext = coder.decrypt(crymsg)
print(plaintext)

代码运行后,能够看到加密后的密文比原文要长。实际运行时,密钥一定要保存好,丢失了密文就基本解不出来了。当然暴力破解还是可以的,只不过代价巨大。