仕事

hogehoge

仕事せずに一生好きな勉強していたい。

数学

HaskellでRSA実装した。嘘つけ

module Main where

import System.Random
import Data.Char

import Lib

-- 参考(rubyだけど)
-- http://hanatsuu.hatenablog.com/entry/2017/10/30/211301

main :: IO ()
main = do
  gen <- getStdGen
  let rnds = take 2 $ drop 15 primes
      -- ここら辺最高にカス
      p = rnds !! 0
      q = rnds !! 1
      n = p * q
      l = lcm (p - 1) (q - 1)
      e = head $ filter (\x -> gcd x l == 1) [2..l]
      d = head $ filter (\x -> x * e `mod` l == 1) [2..l]
      plain_text = "hello world"
      plain_text_list = map (\x -> toInteger $ ord x) plain_text
  print plain_text_list
  print $ enOrDecrypt plain_text_list e n
  print $ map (\x -> chr $ fromIntegral x) $ enOrDecrypt (enOrDecrypt plain_text_list e n) d n

primes :: [Int]
primes = 2:filter (\x -> 2 ^ (x - 1) `mod` x == 1) [2..]

enOrDecrypt :: [Integer] -> Int -> Int -> [Integer]
enOrDecrypt xs eORd n = map (\x -> x ^ (toInteger eORd) `mod` (toInteger n)) $ map toInteger xs

なお、ここではMain.hsに直書きしていたが、後ほど別ファイルに実装分けたりした。

でかい素数は結局用意できなかった。。。今後の課題かもしれない。

もっといい実装は当然ある。多分全角文字とか無理だし。

でもとりあえずの目標は達成できた。それだけでも数日いきていける気がする。

ちなみに今回参考にしたページ

はRubyでとても読みやすかった。ただ一つ、素数の判定があってなさそうな気がするけどどうなんだろう。

Prime.prime?でよくねって思ったりした。

さて、話を数学メインの方に戻すと今グラフのとこやってるけどHaskellのパッケージ管理理解してないせいか

インストールしたらreplが起動しなくなったりして辛かった。

グラフもできることならHaskellでやりたい。Clojureもやりたい。RubyもやりたいけどJavaはやりたく無い(仕事)。

ちなみにJavaでもRSA笑実装したけど数百行になって辛かった。書くのも辛かった。

けどBigIntegerは割と良いと思った。

その他

ここまで書いて気がついた。

数学と英語は楽しくない(直球)のでそんなに効率的に進まない。

私が大好きで仕方ないのはプログラミングなのでそれ以外は正直やりたくない。

でも英語の記事みたいしプログラミングの幅も広げたい。わがまますぎる。

英語はまだ進むんだけど、数学が全然進まない。プログラミングできるところしかやってない。

しかしながら、英語は記事読みたいのでやらねばならんが、

数学は仕事で活かすことはなさそう(低賃金で学歴カスだし)なので

数学は楽しいところだけやってもいいのかもしれない。

せっかく暗号技術入門という本があるのでこちらをやってみようか。

本をペラペラとめくってみると、使い捨てパッドという暗号化があるみたいなので試しに実装してみようかなー。

ちなみにこの使い捨てパッド、ニコニコ動画でHaskellで実装してみた的な動画が上がっててびっくりした。

プログラミング実況をしながら雑談をする動画:Haskellで暗号解読(前編)

ちなみにこちらは実装と解読もしようとしているのでレベルがはるかに違う。

軽々しく数学をやっているなどと喚いてはいけない(自戒)。算数楽しい。

oneTimePad :: IO ()
oneTimePad = do
  g <- getStdGen
  let rndLst = randomRs (0,256) g :: [Int]
      plain_txt = "hello world"
      (enc,pass) = enORdecrypt plain_txt rndLst
      (dec,_) = enORdecrypt enc pass
  print enc
  print dec

enORdecrypt :: String -> [Int] -> (String,[Int])
enORdecrypt txt xs = (zipWith (\x y -> chr (x `xor` y)) txtToIntList rndLimitList,rndLimitList)
  where txtToIntList = map ord txt
        rndLimitList = take (length txtToIntList) xs

int2bin :: Int -> [Int]
int2bin n = reverse $ int2binInternal n

int2binInternal :: Int -> [Int]
int2binInternal 0 = []
int2binInternal n = n `mod` 2 : int2binInternal (n `div` 2)

使い捨てパッド作った。乱数はまた適当。なおここまでモナド要素一切なし。

や、私はHaskellerではないので。モナド、だいたい理解した(当社比)けど使いどきがわからないという矛盾が発生していて

実質まるで理解してない状態なので辛い。Haskeller名乗るの後2年くらいかかるのでは。

次はDESをやっていきDES。

Go 言語で学ぶ『暗号技術入門』Part 1 -DES, Triple DES-

ここら辺が参考になりそうかなー。

本によると現在は総当たりで余裕で倒せる雑魚らしいので実装も余裕っしょ。

といったところで22時になってしまったので英語の時間だから明日やろう。

英語

単語勉強した。眠かった。

今日やったこと

明日やること