その他
    ホーム 技術発信 DoRuby ruby で rsa暗号化した文字列を jsで復号する

    ruby で rsa暗号化した文字列を jsで復号する

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    データを暗号化することがいろいろな理由で必要となり試したのでメモします。 暗号方式は rsa を使います。公開鍵で暗号化して秘密鍵で復号します。 ※ 私の試したところだと秘密鍵で暗号化すると復号できませんでした。

    環境

    ruby は openssl と base64 を使います。
    ※ require すれば使えるはず。

    javascript は jsencrypt.js を使います。
    ※ https://github.com/travist/jsencrypt

    ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
    CentOS Linux release 7.1.1503 (Core)

    bashでしておくこと

    秘密鍵を作ります。
    ssh-keygen を使うとデフォルトで
    ~/.ssh/ ディレクトリに
    id_rsa と id_rsa.pub が作成されます。秘密鍵と公開鍵です。
    秘密鍵の中身はそのまま使えますが、公開鍵はそのままだと今回の用途では使えないので pem フォーマットにします。
    ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/pem
    pem の中身を公開鍵として使います。

    rubyでの暗号化

    # ライブラリの読み込み

    require ‘openssl’
    require ‘base64’

    class Encryptor
    attr_accessor :pub, :public_key
    def initialize
    # pemフォーマットの公開鍵ファイルの内容を取得
    self.pub = File.read(ENV[‘HOME’] + ‘/.ssh/pem’)
    # 鍵をOpenSSLのオブジェクトにする
    self.public_key = OpenSSL::PKey::RSA.new(pub)
    end

    # 引数 str を暗号化した結果を返す
    def enc(str)
    # str に与えた文字列を暗号化します。
    Base64.encode64(public_key.public_encrypt(str)).delete(“\n”)
    end
    end

    javascriptでの復号

    // jquery と jsencrypt.js を読み込んでおく。

    crypted = ‘暗号化された文字列’;
    pricate_key = ‘id_rsaファイルの中身のテキスト’;
    crypt = new JSEncrypt();
    crypt.setPrivateKey(private_key);

    // decrypted に復号された文字列が代入される
    decrypted = crypt.decrypt(crypted);

    参考

    jsで暗号化しrubyで復号する
    http://qiita.com/shigekid/items/60d3387de6a804bc38b9

    CryptoJS
    https://jsfiddle.net/hibara/qzono8jb/

    perlで暗号化し js で復号する。
    http://hatyuki.hatenablog.jp/entry/2013/09/04/151142