到底唸Caesar還是Caesar,我都唸Caesar。
今天要釐清一個非常重要的事情。非常重要。
我們先來看這個東西,它叫做凱薩密碼。
這裡的凱薩,就是古羅馬的那個凱薩。凱薩發明用來加密的方法,叫做凱薩密碼 ( Caesar cipher )。
他的做法是將每一個英文字母都往後推n個,上圖表示為 n=2 ( 而凱薩使用的是n=3 )。
小舉例:hello world → jgnnq yqtnf
如果我要寫一個程式實作凱薩密碼,最直觀的方法就是把每個字母的對應關係告訴電腦。
問題來了,如果我今天想要改變偏移量(也就是n),比如說我想要讓A對應到E,而非原本的C
那我不就要重新再打一份對應表了嗎。
於是最好的方法,就是編碼 ( encode )。
編碼是把資料換個表示方法儲存。
我們要把原本的英文字母,換成可以用來運算的數字。
於是我讓 A→1、B→2、C→3、....、Z→26好方便計算。
經過這樣的轉換,凱薩密碼就可以寫成:
其中E(x)是加密函數、D(x)是解密函數、mod26則是除以26取餘數的意思。
而A→1、B→2、C→3、....、Z→26這個過程,就叫編碼。
編碼的功能有很多:例如方便資料傳遞、防止不同的編碼打架、修正錯誤等等。
但最重要的是,編碼是沒有辦法保護資料的。
更多的像ASCII、UTF-8、base64、甚至摩斯密碼等也都是編碼方式。
是不具有隱藏資訊的功能的,任何知道編碼方式的人都可以把它還原成文字。
所以絕對不要再把編碼跟加密搞錯了。
( 這幾天找資料的過程中也很常出現許多網站把 encode 誤打成是 encrypt,尤其是外國網站)
*base64 是一種編碼方式
而加密 ( encrypt ) 則是需要密鑰的訊息轉換過程,為的是隱藏資訊。
在這個例子裡,密鑰就是n。如果不知道n,就沒辦法把原本的文字變回來。
不過當然,因為這個例子很簡單,英文字母也就26個,多猜幾次就猜出來了。
而在之後的文章裡,也都是著重於加密的方面哦。
接著,
既然講了凱薩密碼,我們就來講一下相對應的攻擊方式。
除了上面所講的窮舉法之外,另一個很好玩的東西叫做字母頻率分析。
在有字母的語言裡,每個字母出現的頻率都不一樣。
舉例來說,英文最常出現的字母是e,接著是t、a、o、i
於是,像這種一個字母對應到另一個字母的加密方式就可以用字母頻率分析來破解。
最後補一個上面的坑
不是你家電視的MOD,是modulo的簡寫。
y mod x 的意思,就是取y除以x的餘數。這樣的目的,是讓我們的計算結果都可以落在一個範圍之內。
如果你無法想像的話,想想看時鐘好了。
我們都知道18點就是6點,20點就是8點
18 mod 12 = 6、20 mod 12 = 8
時鐘就是一個mod 12 的運算。
所以不論時間過多久,他永遠在12點之內 。
凱薩密碼要讓字母永遠在編碼26之內,
也就是說如果我要用數學方式把 z 轉換成 b ,那就要計算(26+2) mod 26 = 2,也就是b。
那今天就這樣囉,如果你很無聊,可以玩看看我用python寫的caesar cipher。我放在底下。
def caesar(text,n):
result = str()
for i in range(len(text)):
a = text[i]
if ord(a) != 32:
if ord(a) < 97:
result += chr((ord(a) + n-65) % 26 + 65)
else:
result += chr((ord(a) + n - 97) % 26 + 97)
else:
result += " "
return result
msg = input()
n = int(input())
print (caesar(msg,n))
圖片來源:
https://windsongtraining.ca/encryption-part-1-the-caesar-cipher/
http://www.quickmeme.com/meme/36aj0j