From: "NARUSE, Yui" Date: 2006-05-01T06:23:51+09:00 Subject: [ruby-dev:28610] openssl aes-*-cbc is broken 成瀬です。 openssl モジュールの AES (CBC mode) が使えないようです。 require'openssl' c1 = OpenSSL::Cipher::Cipher.new("AES-256-CBC") 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 を実行しようとすると、c2.final で以下のエラーが発生します。 OpenSSL::CipherError: bad decrypt from (irb):359:in `OpenSSL::Cipher::Cipher#final' from (irb):359:in `Kernel#binding' from :0 aes-128-cfb aes-128-ecb aes-128-ofb といった CBC 以外のモードでは動作しますし、 AES以外の方式の CBC は動作します。 また、openssl コマンドからだと動作するので、 Ruby/OpenSSL の問題だと思うのですが、それ以上は調べ切れませんでした。 ところで、OpenSSL::Cipher::AESですが、 openssl では -aes が無いため、 OpenSSL::Cipher::AES.new(256, 'cbc') などとしないと初期化できません。 OpenSSL::Cipher::AES128, OpenSSL::Cipher::AES192, OpenSSL::Cipher::AES256 ならば、 それぞれ -aes128, -aes192, -aes256 と対応するため、 引数なしでインスタンスを作れるのでいいと思うのですが。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA