Rubyで3DESを使用する際に鍵を複数指定する方法に

移転しました。

Rubyメーリングリストで、Rubyで3DESを使用する際に鍵を複数指定する方法に
ついて問合せたところ、ものすごい良い回答が帰ってきました。

以下ソースです。もしソース公開に不都合があればご連絡ください。

require 'openssl'
require 'md5'
include OpenSSL::Cipher

key1 = MD5.digest('keymessage1')[0..7]
key2 = MD5.digest('keymessage2')[0..7]
msg = "12345678"

#
# TripleDES(des-ede)で暗号(key1+key2)
#
c1 = Cipher.new("des-ede")
c1.key = key1 + key2
c1.padding = 0
msg1_e = c1.encrypt.update(msg) + c1.final

#
# DESで暗号(key1)→復号(key2)→暗号(key1)
#
c21 = Cipher.new("des-ecb")
c21.key = key1
c21.padding = 0
c22 = Cipher.new("des-ecb")
c22.key = key2
c22.padding = 0
# key1で暗号化
msg2_e = c21.encrypt.update(msg) + c21.final
# key2で復号
msg2_ed = c22.decrypt.update(msg2_e) + c22.final
# key1で暗号化
msg2_ede = c21.encrypt.update(msg2_ed) + c21.final

# 暗号文を比較
p msg1_e == msg2_ede # => true

# 暗号文が同じなので当然ですが、どっちでも復号できます
# msg2_edeをc1で復号
msg1d = c1.decrypt.update(msg2_ede) + c1.final
p msg1d # => "12345678"
# msg1_eをc21, c22で復号(復号(key1)→暗号(key2)→復号(key1))
msg2d_ed = c21.decrypt.update(msg1_e) + c21.final
msg2d_e = c22.encrypt.update(msg2d_ed) + c22.final
msg2d = c21.decrypt.update(msg2d_e) + c21.final
p msg2d # => "12345678"


よく分かってませんがpadding = 0をしないと
key2で復号するところで怒られます。
"bad decrypt (OpenSSL::CipherError)"
(PKCS?とかの関係らしいですが詳しく調べていません)