(二)传统密码——Caesar密码
Caesar密码是已知最早的代换密码,又Julius Caesar发明。
Caesar密码非常简单,就是对字母表中的每个字母,用它之后的第三个字母来代换。例如:
明文:meet me after the toga party
密文:PHHW PH DIWHU WKH WRJD SDUWB
(在密码学中一般使用小写字母表示明文,大写字母表示密文)
如果我们让每个字母对应一个数字,比如字母 a-z分别与数字 0-25对应。那么加密算法可以用如下表达式表达。对每个明文字母p,代换成秘文字母C:
还可以更改移位的数量k,这样就得到了一般的Caesar算法, k的取值从1到25:
解密算法为:
用python实现的Caesar算法如下:
def Caeser_encode(text, offset=3):
result = []
for t in text.lower().encode():
result.append((t + offset - 97) % 26 + 97)
return bytes(result).decode()
def Caeser_decode(text, offset=3):
result = []
for t in text.lower().encode():
result.append((t - offset - 97) % 26 + 97)
return bytes(result).decode()
代码里的97对应字母a的ascii码值。
Caesar算法有三个特征:
- 已知加密和解密算法
- 密钥空间只有25
- 明文所用的语言是已知的,且其意义易于识别
根据Caeser算法的这三个特征攻击者可以使用穷举攻击来获取密钥和明文。用python实现的一种破解方式如下:
def Caeser_attack(text):
for i in range(26):
print(Caeser_decode(text, i), i)
对于密文:PHHW
使用破解算法的输出如下:
phhw 0
oggv 1
nffu 2
meet 3
ldds 4
kccr 5
jbbq 6
iaap 7
hzzo 8
gyyn 9
fxxm 10
ewwl 11
dvvk 12
cuuj 13
btti 14
assh 15
zrrg 16
yqqf 17
xppe 18
wood 19
vnnc 20
ummb 21
tlla 22
skkz 23
rjjy 24
qiix 25
可以很容易看出,只有当i=3时,解密出的明文才是有意义的,所以可以确定密钥k=3。
这里需要特别注意的是,攻击者能够破解密文并不意味着可以获取信息,如果用来加密的明文本身是不可识别的(比如明文是用其他加密算法加密过的),攻击者就无法通过穷举的方式来获取密钥,因为攻击者无法知道哪一个输出才是对应的明文。