最後。
require "openssl" passwd = "piyo" regist_address = 'XFALilSWAmQOfmhjwOwVlA==' enc = regist_address.unpack('m').first dec = OpenSSL::Cipher::BF.new("ECB").decrypt dec.key_len = passwd.length dec.key = passwd dec.padding = 0 dec.update(enc)
で復号化できたー。 元々 ECB だったのを CBC だと思い込んだので、思わず色々理解できた :)。
でまぁ、折角なので、CBC でも decrypt できるようにしてみる。 ここの図が分かりやすい。
def _decrypt(s) o = "" yl, yr = @bf.iv (s.length / 8).times do bl = l = to32(s[0..3]) br = r = to32(s[4..7]) s[0..7] = "" l, r = yield(l, r) l ^= yl r ^= yr (0..3).each{|n| o << from32(l, n)} (0..3).each{|n| o << from32(r, n)} yl = bl yr = br end o end
復号化なので、暗号文を切り出して(to32)、次の入力用に保存しつつ(bl, br)、 復号化処理(yield の先の @bf.decipher)して、前回からの入力(最初は iv)と XOR して、 平文を保存(from32)。保存しといた暗号文を次回の入力に。 もう、yield を使って他の処理を共通化する必要もないけど。