2013年3月14日木曜日

Rubyによる暗号化/復号化

RubyでAESの暗号化を行う必要があり初めての対応。
今回は復号化する側がJavaらしいので、考慮しつつ…。
Ruby1.9.3を用いて、先のBase64も利用。

スクリプト
require 'openssl'
require 'base64'

def encrypt(data, key, iv)
  cipher = OpenSSL::Cipher.new('aes-128-cbc')
  cipher.encrypt
  cipher.key = key
  cipher.iv = iv
  cipher.update(data) + cipher.final
end

def decrypt(data, key, iv)
  cipher = OpenSSL::Cipher.new('aes-128-cbc')
  cipher.decrypt
  cipher.key = key
  cipher.iv = iv
  cipher.update(data) + cipher.final
end

def main(data)
  key = "1234567890123456"
  iv = "abcdef1234567890"

  # 暗号化
  result = encrypt(data, key, iv)
  base64text = Base64::strict_encode64(result)

  # 復号化
  text = Base64::strict_decode64(base64text)
  dec_data = decrypt(text, key, iv)

  # 確認
  puts "<plain>"
  puts data
  puts "<after decrypt>"
  puts dec_data
  puts "<compare>"
  puts data == dec_data
end

if ARGV.length != 1
  puts "usage: ruby #{__FILE__} data"
  exit 0
end

main(ARGV[0])

注意点
  • cipher.encrypt、cipher.decryptは、インスタンスを作ったら呼んでおく。
  • aes-128-cbc のときは、keyが16bytes、aes-256-cbc のときは、keyを32bytesにする。
    • aes-256-cbc の時にkeyを16bytesにしたままだとこんなエラーが出る。
    • OpenSSL::Cipher::CipherError (key length too short):
  • cipher.final は忘れずに呼んでおく。データは終わりだよという指示。

参考
http://www.ruby-lang.org/ja/old-man/html/OpenSSL_Cipher_Cipher.html
http://blog.matake.jp/archives/openssl_cipher_ruby_jruby
http://techmedia-think.hatenablog.com/entry/20110527/1306499951

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。