學習軌道
/
Pharo
Pharo
/
練習
/
簡易加密法
簡易加密法

簡易加密法

中等

說明

實作一個像凱撒密碼那樣簡單的移位密碼,以及一個更安全的替換密碼。

步驟 1

「如果他有什么機密要說,他就用密碼寫下來,也就是把字母表的字母順序改變,讓人無法辨識出任何一個字。 任何人若想解讀這些內容、理解其中含義,就必須用字母表中的第四個字母,也就是 D,來取代 A,其餘字母依此類推。」

蘇埃托尼烏斯,《尤利烏斯·凱撒傳》

密碼是一種非常簡單直接的演算法,能讓文字變得不易閱讀,同時又仍能輕鬆解讀。 這類密碼很容易被各種密碼分析方法破解,但凱撒很幸運,他的敵人並不是密碼分析師。

凱撒密碼曾被用來傳送尤利烏斯·凱撒發往遠方的一些訊息。 凱撒知道這個密碼並不怎麼高明,但在這一點上他有一個盟友:當時幾乎沒有人能好好識字。 所以即使偏移了幾個字母,也足以讓人認不出自己本來認識的那幾個字。

你的任務是建立一個像凱撒密碼這樣的簡單移位密碼。 下面這張圖是凱撒密碼的絕佳範例:

凱撒密碼

例如:

把「iamapandabear」當作輸入傳給編碼函式,會回傳密碼「ldpdsdqgdehdu」。 模糊得足以在傳輸過程中保密我們的訊息。

把「ldpdsdqgdehdu」放進解碼函式,就會回傳原始的「iamapandabear」,讓你的朋友讀到你原本的訊息。

步驟 2

當敵方指揮官識破移位密碼之後,它很快就會失去用處。 所以我們改用替換密碼試試看吧。 試著修改程式,讓我們可以指定一組金鑰,並用它來決定位移距離。

這裡有個例子:

給定金鑰「aaaaaaaaaaaaaaaaaa」,將字串「iamapandabear」編碼, 會回傳原本的「iamapandabear」。

給定金鑰「ddddddddddddddddd」,將我們的字串「iamapandabear」編碼, 則會回傳經過遮蔽的「ldpdsdqgdehdu」

在上面的例子中,我們把 a 設為 0 當作金鑰值。 所以當明文加上金鑰之後,輸出的訊息會和原本一模一樣。 因此「aaaa」不是理想的金鑰。 但要是把金鑰設為「dddd」,結果就會和凱撒密碼相同。

步驟 3

任何密碼中最脆弱的一環,就是人。 我們來讓你的替換密碼更能容錯吧:提供一個隨機來源,並確保金鑰只包含小寫字母。

如果有人完全沒有提供金鑰,就產生一組真正隨機、長度至少 100 個小寫字元的金鑰。

延伸練習

移位密碼的做法是讓文字變得有點古怪,但很容易受到頻率分析攻擊。 替換密碼能改善這一點,但當金鑰很短,或是保留了空格時,它依然非常脆弱。 之後你會在「crypto-square」這個練習中看到這個問題的一種解法。

如果你想在這個領域更進一步,問題就會開始圍繞著我們要如何安全地交換金鑰。 想知道這個方案最早的實作之一,可以看看維基百科上的 Diffie-Hellman。

注意

當索引超出範圍時,可以試著用取餘數這類的算術運算,讓索引繞回開頭。Character 和 String 類別也是你的好幫手喔。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Pharo Exercism

準備好開始 簡易加密法 了嗎?

註冊 Exercism,透過 50 個練習 和真人引導來學習並精通 Pharo,全部免費。