2013年01月21日(Mon)
■ ruby1.9.3で暗号化と復号化に挑戦してみた。
rjtest.rb 結果:エラー
http://d.hatena.ne.jp/rubyco/20081201/crypt からコードを移して実行してみた。
実行結果
%ruby rjtest.rb plain.txt is created. Enter password to encrypt: $HOME/local/lib/ruby/gem/gems/crypt-1.1.4/crypt/stringxor.rb:9:in `^': undefined method `length' for 104:Fixnum (NoMethodError)
よくわからないけれど、どこかにcryptはもう古いよって書いてあった。サンプルのパスワードを手入力で受け付ける部分は真似したいと思った。
http://www.ruby-lang.orgのサンプル三種類
http://www.ruby-lang.org/ja/old-man/html/OpenSSL_Cipher_Cipher.html
サンプル1
require 'openssl' p a123 = "0123456789" pass = "hogehoge" enc = OpenSSL::Cipher::DES.new enc.encrypt enc.pkcs5_keyivgen(pass) p a = enc.update(a123) p b = enc.final s = a + b dec = OpenSSL::Cipher::DES.new dec.decrypt dec.pkcs5_keyivgen(pass) p a = dec.update(s) p b = dec.final p a + b #=> "0123456789"
動いた。
サンプル2
require 'openssl' # Triple DES c1 = OpenSSL::Cipher::Cipher.new("DES-EDE3-CBC") c2 = OpenSSL::Cipher::DES.new(:EDE3, "CBC") pass = "open sesame!" data = "Hello world!" c1.pkcs5_keyivgen(pass) s1 = c1.encrypt.update(data) + c1.final c2.pkcs5_keyivgen(pass) s2 = c2.decrypt.update(s1) + c2.final p(data == s2) #=> true
動いた。incdlue OpenSSL::Cipherが効かなかったので、CipherやDESの前に付けたら動いた。上のコード改変している。次のコードも同じく改変した。
サンプル3
require 'openssl' c1 = OpenSSL::Cipher::Cipher.new("AES256") c2 = OpenSSL::Cipher::Cipher.new("AES-256-CBC") pass = "open sesame!" data = "Hello world!" c1.pkcs5_keyivgen(pass) s1 = c1.encrypt.update(data) + c1.final c2.pkcs5_keyivgen(pass) s2 = c2.decrypt.update(s1) + c2.final p(data == s2) #=> true
しかし、結果はエラーでdecryptできなかった。最後のc2.finalでこけているらしい。
実行結果
%ruby test2.rb test2.rb:13:in `final': bad decrypt (OpenSSL::Cipher::CipherError) from test2.rb:13:in `<main>'
ウノウラボさんのサンプル
http://unoh.github.com/2007/05/24/ruby.html
2007年のもの。1.9.3では、途中一行を変更したら動いた。
変更前
((enc.update(aaa) + enc.final).unpack("H*")).to_s
変更後
((enc.update(aaa) + enc.final).unpack("H*"))[0]