とりあえず、後半部分の pass -> (key, iv) の部分は、分かった。
def keyivgen(pass, salt = "", digest = Digest::MD5.new)
m = digest.dup.update(pass + salt).digest.match(/\A(.{16})(.*?)\z/mn)
data, key, iv = m.to_a
iv << digest.dup.update(data + pass + salt).digest if iv.size < 8
return key, iv.unpack("N2")
end
とか。あと、openssl に -nopad を付けなくても、
def encrypt(s)
pad = 8 - s.length % 8
s += 1.chr * pad
_crypt(s) { |l,r| @bf.encipher(l,r) }
end
ってな感じにしとけば OK。でもまだ decrypt はできない。えーん。