今回は復号化する側が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にしたままだとこんなエラーが出る。
- cipher.final は忘れずに呼んでおく。データは終わりだよという指示。
OpenSSL::Cipher::CipherError (key length too short):
参考
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