アトバシュ暗号を実装してみましょう。アトバシュ暗号は、中東で生まれた古代の暗号方式です。
アトバシュ暗号は単純な換字式暗号で、アルファベットのすべての文字を並べ替えて、逆順のアルファベットにする仕組みです。最初の文字は最後の文字に、2番目の文字は後ろから2番目の文字に置き換わり、以下同様に続きます。
ラテン文字に対するアトバシュ暗号は、次のようになります。
Plain: abcdefghijklmnopqrstuvwxyz
Cipher: zyxwvutsrqponmlkjihgfedcba
鍵が1つしかなく、単純な単一換字式暗号であるため、非常に弱い暗号です。しかし、この暗号が使われていた時代には、問題にならなかったのかもしれません。
暗号文は固定長のグループに分けて書きます。伝統的なグループの長さは5文字で、数字はそのまま残し、句読点は取り除きます。これは、単語の区切りから内容を推測されにくくするためです。エンコードされるテキストは、すべて小文字になります。
testをエンコードするとgvhgになりますx123 yesをエンコードするとc123b vhになりますgvhgをデコードするとtestになりますgsvjf rxpyi ldmul cqfnk hlevi gsvoz abwltをデコードするとthequickbrownfoxjumpsoverthelazydogになりますdecodeとencodeという関数を実装します。この2つの関数は、Atbash暗号を使ってStringをデコードおよびエンコードします。
型がわからないときは、用意されているシグネチャを使ってもかまいません。ただ、それに縛られて自由な発想を狭めないようにしましょう。
この演習ではテキストデータを扱います。歴史的な理由から、HaskellのString型は、文字のリストである[Char]と同じ意味を持ちます。テキストデータをより効率よく扱うには、Text型を使うこともできます。
この演習の任意の発展として、次のこともできます。
import qualified Data.Text as T
import Data.Text (Text)
Text型を使うこと(例えばdecode :: Text -> Text)。また、Data.Textのコンビネーターは、例えばT.packのように参照すること。Data.Textのドキュメントを調べること。StringをすべてTextに置き換えること。つまり、次のとおりです。decode :: Text -> Text
decode cipherText = ...
encode :: Text -> Text
encode plainText = ...
この部分は完全に任意です。