top page > computer > haskell > web_lecture > for_programmer > make_function.html
更新日:
文責: 重城良国

関数を作る

題材

RSA暗号の暗号化、復号関数を作る。関数定義を学ぶのが目的なのでRSA暗号の深い話はしない。鍵の作りかたは説明しない。用意した鍵のペアを使う。

公開鍵暗号

王様は国民の本音が知りたい。投書を入れる箱を配る。しかし、大臣が読むとなると本音が書けない。箱や鍵をとどけられるのは大臣だけだ。どうしたらいいだろうか。しめるときとあけるときで別の鍵を使う箱を作る。箱と「しめる鍵」を国民にとどける。国民は箱に投書を入れて「しめる鍵」でしめる。「あける鍵」を持っている王様だけが箱をあけられる。

[公開鍵暗号のメタファーの図]

これが公開鍵暗号だ。公開している鍵でメッセージを暗号化させる。送られてきたメッセージを自分だけの秘密の鍵で復号する。不特定多数の人からの秘密のメッセージが受信できる。

RSA暗号とは

適切に選ばれた3つの値e, d, nによる単純な計算での公開鍵暗号だ。HTTPSの鍵交換に使われている。

RSA暗号の計算式

乗算と剰余

平文mをe乗しnで割り余りをとり暗号文cを求める。暗号文cをd乗しnで割り余りをとると平文mにもどる。べき乗と剰余の計算を使う。

% ghci
Prelude> 2 ^ 10
1024
Prelude> 13 `mod` 5
3

べき乗には演算子(^)を使う。剰余の計算には演算子`mod`を使う。modの前後につけるのはバッククォートだ。

暗号化と復号の式

暗号化と復号の式を示す。

c = m ^ e `mod` n
m = c ^ d `mod` n

ここではe = 13, d = 95497, n = 138689とする。

対話環境での暗号化と復号

「let 変数 = 式」は対話環境での変数の定義だ。

Prelude> let e = 13
Prelude> let d = 95497
Prelude> let n = 138689
Prelude> 12345 ^ e `mod` n
47046
Prelude> 47046 ^ d `mod` n
12345
Prelude> 4492 ^ e `mod` n
47255
Prelude> 47255 ^ d `mod` n
4492

値の暗号化と復号ができた。(13, 138689)が公開鍵で95497が秘密鍵だ。

暗号化関数、複号関数

nとeの値と平文を引数とし暗号文を返す関数と、nとdの値と暗号文を引数とし平文を返す関数を作成する。ファイルrsa.hsを作成し以下のように記述する。

rsa.hs

encrypt n e m = m ^ e `mod` n
decrypt n d c = c ^ d `mod` n

関数名のあとに仮引数をならべ、=に関数の本体を続ける。引数リストを丸括弧でかこんだりカンマでくぎったりしない。関数の本体も波括弧でかこまない。

ghciを終了していたなら

% ghci rsa.hs

のように読み込む。立ち上げたままなら:loadまたは:lで読み込む。

Prelude> :load rsa.hs

関数encrypt、decryptを試してみる。

*Main> encrypt 138689 13 12345
47046
*Main> decrypt 138689 95497 47046
12345

復号できた。

まとめ

課題

  1. 対話環境で変数を定義せよ
  2. 対話環境での定義ファイルの読みこみ
  3. 以下の関数を作成し対話環境に読みこみ試せ

「対話環境に触れる」へもどる 「部分適用」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics