ゆるゆるRSA暗号 その1 - なんちゃって実装編

RSA暗号を自前で実装してみた。 現状いくつか問題があるが、公開鍵/秘密鍵の生成, 数値の暗号化/解読ができる。

gist.github.com

使い方

[narukami894] ruby $ irb
irb(main):001:0> require "./rsa"
=> true
irb(main):002:0> RSA.generate
Public Key: '291311:290231'
Secret Key: '290231'
=> nil
irb(main):003:0> RSA.encrypt(42, '291311:290231')
Code: '6936'
=> nil
irb(main):004:0> RSA.decrypt(6936, '291311:290231', 290231)
Message: '42'
=> nil

モチベーション

ブログのネタが欲しかった セキュリティマネジメント試験の勉強をしている時に、そういえばRSA暗号ってどういう仕組みなんだろう?ってふと思い。

所感

RSA暗号についてのWikipediaや他のブログ記事をみながら作ったもので、 数学を高校の数IIBで投げ出した自分には公式の定義をみた時に多少アレルギー反応が出たが、いざ書いてみるとたった60行程度で実装できて、驚いた。

あらゆる場所で使われている強固な暗号の原理がこんなシンプルなものっていうのに単純に関心する。やはりシンプルなものは強くて美しいのだ。 ただ現状だと、桁数が大きい時にエラーが出てしまうので生成する素数の桁をかなり小さくしている。たぶん速攻で解読されてしまうと思う。

前述したが数学の知識が皆無なので、乱数の生成はprimeライブラリに頼り、 秘密鍵の生成は素のrubyだと遅かったので、techrachoに出てきたインラインC拡張ライブラリを使うなどした。 (正直RubyInlineを使ってみたかっただけで、実際に速度を測ったわけではない。次回測るか)

techracho.bpsinc.jp

おわりに

車輪の再発明(と言えるのかも怪しいくらい)ではあるが、他の実装をカンニングしなかったことは自分を褒めたい。 一応その1と銘打っていて、次回は答え合わせとしてRubyの標準ライブラリのOpenSSLを見たり、他の人のブログのRSA暗号の実装を見てみることとする。 docs.ruby-lang.org