7rpn’s blog: うわああああな日常

好きなことをつらつらと。

JavaScriptで文章を暗号化してRuby(Rails)で複合化する

というわけで, JavaScript上で文章をRSA暗号で暗号化して,Ruby(Rails)で複合化するってことをやってみました。 PHPで複合化する記事なら嫌というほど見つけられましたが,Rubyでやってる記事が一切見当たらなかったので。

まぁ見つからないってことはそんなに必要とされてないことなんでしょう。
無料のSSL証明書あるしそれ使えば済むじゃん,って言われたらそれでおしまいですしね。

下準備

環境: Ruby 2.2.2
JavaScriptの暗号化ライブラリは数多くありますが,今回はJSencrypt.jsを使いました。 こちらgithubにあるライブラリです。
あとRailsって書いておきながら実行はSinatraでやったので,ノリでRailsに乗せて行きます。Railsのほうがキャッチーだしね。

コード

とりあえず公開鍵作成のコントローラーから。普通に暗号鍵を作って公開鍵をViewに渡すだけのシンプルな関数です。

#controllers/hoge_controller.rb
class HogeController < ApplicationController
  def new
    rsa = OpenSSL::PKey::RSA.generate(2048) # 公開鍵と秘密鍵作成
    @pub_key = rsa.public_key.to_s.gsub(/\n/,"") # 秘密鍵をViewに渡す
    $rsa_obj = rsa # とりあえずグローバル変数に入れる,実装環境だとセッションごとに共通させたりみたいな処理が要るよね
  end
  # 略
end

次にJavaScriptに暗号鍵を渡して,暗号化します。 encrypt_buttonが押されたらフォームに入力した内容が暗号化される感じ。

<script>
$(document).ready(function(){
  $('#encrypt_button').click(function(){
    var message = $('#message_area').val();
    var enc = new JSEncrypt();
    enc.setPublicKey('<%=@pass%>'); // JSEncryptに公開鍵突っ込む
    var cipher = enc.encrypt(message); // 暗号化
    $('#message_area').val(cipher);
  });
});
</script>

そして,Postされた暗号を複合化するコントローラー。

#controllers/hoge_controller.rb
class HogeController < ApplicationController
  # 略
  def post
    message = @params[:message]
    crypt_arr = Base64.decode64(message) # Base64でデコードする
    output = $rsa_obj.private_decrypt(crypt_arr) # 秘密鍵で複合化
    render plain: "Hello!#{output}"
  end
end

formに「JSencrpt!」って入力して,「Hello!JSencript!」って返ってこれば成功。 f:id:s7rpn:20150926013956p:plain:w300

こちらのサイトの記事を激しく参考にしました。Perlなら読めるので。PHPは意味不明すぎる
ちなみに内容自体はそんなに難しいことではないんですが,"message"を"messege"って誤記していて結構ハマりました。マクルーハンの呪いか。笑