この記事はアピリッツの技術ブログ「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