學習軌道
/
Haskell
Haskell
/
練習
/
埃特巴什密碼
埃特巴什密碼

埃特巴什密碼

中等

說明

請實作 Atbash 密碼,這是一種源自中東的古老加密系統。

Atbash 密碼是一種簡單的替換式密碼,作法是將字母表中所有字母的順序反轉,讓產生的字母表變成反向排列。第一個字母由最後一個字母取代,第二個字母由倒數第二個字母取代,依此類推。

拉丁字母的 Atbash 密碼如下:

Plain:  abcdefghijklmnopqrstuvwxyz
Cipher: zyxwvutsrqponmlkjihgfedcba

這種密碼的強度非常弱,因為它只有一種可能的金鑰,而且只是簡單的單表替換式密碼。不過,在這種密碼誕生的年代,這或許算不上問題。

密文會以固定長度分組寫出,傳統的分組大小是 5 個字母,數字保持不變,標點符號則會省略。這麼做是為了讓人更難依照詞語邊界猜出內容。所有文字都會編碼成小寫字母。

範例

  • 將test編碼會得到gvhg
  • 將x123 yes編碼會得到c123b vh
  • 將gvhg解碼會得到test
  • 將gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt解碼會得到thequickbrownfoxjumpsoverthelazydog

提示

你需要實作decode和encode兩個函式,它們會用 Atbash 加密法來解碼和編碼String。 如果不確定型別,你可以使用提供的簽章,但別讓它限制你的創意。

這個練習處理的是文字資料。基於歷史因素,Haskell 的String型別等同於[Char],也就是字元的陣列。若要更有效率地處理文字資料,可以使用Text型別。

作為這個練習的選用延伸,你可以

  • 閱讀 Haskell 的字串型別。
  • 在 package.yaml 的相依清單中加入- text。
  • 用下列方式匯入Data.Text:
import qualified Data.Text as T
import           Data.Text (Text)
  • 使用Text型別,例如decode :: Text -> Text,並以例如T.pack取用Data.Text的組合子。
  • 查閱Data.Text的文件。
  • 把 Atbash.hs 裡所有String都換成Text,也就是:
decode :: Text -> Text
decode cipherText = ...

encode :: Text -> Text
encode plainText = ...

這個部分完全是選用的。


出處

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

準備好開始 埃特巴什密碼 了嗎?

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