(二)傳統密碼——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算法有三個特徵:

  1. 已知加密和解密算法
  2. 密鑰空間只有25
  3. 明文所用的語言是已知的,且其意義易於識別

根據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。

這裏需要特別注意的是,攻擊者能夠破解密文並不意味着可以獲取信息,如果用來加密的明文本身是不可識別的(比如明文是用其他加密算法加密過的),攻擊者就無法通過窮舉的方式來獲取密鑰,因爲攻擊者無法知道哪一個輸出纔是對應的明文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章