とりあえず、後半部分の 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 はできない。えーん。